use strict;
use warnings;
use feature 'say';

sub identity_matrix {
    my($n) = shift() - 1;
    map { [ (0) x $_, 1, (0) x ($n - $_) ] } 0..$n
}

for (<4 5 6>) {
  say "\n$_:";
  say join ' ', @$_ for identity_matrix $_;
}