in reply to unshift with two-dimensional arrays

Please use use strict. Not using it hides errors, including the one you made.

use strict; use warnings; my @a=([0,1,2]); my @b=([-1,-2,-3]); unshift @a,1; # Creates an element with the value "1". $a[0][0]=4; # Changes element 0 of the array named by $a[0]. $a[0][1]=5; # Changes element 1 of the array named by $a[0]. $a[0][2]=6; # Changes element 2 of the array named by $a[0]. unshift (@b,1); # Creates an element with the value "1". $b[0][0]=7; # Changes element 0 of the array named by $b[0]. $b[0][1]=8; # Changes element 1 of the array named by $b[0]. $b[0][2]=9; # Changes element 2 of the array named by $b[0]. print $a[0][2]; # Print element 2 of the array named by $a[0]. print $a[1][2]; # Print element 2 of the array ref'ed by $a[1]. print $b[0][2]; # Print element 2 of the array named by $b[0]. print $b[1][2]; # Print element 2 of the array ref'ed by $b[1].
Can't use string ("1") as an ARRAY ref while "strict refs" in use at s +cript.pl line 8.

If you want to add a new row, use unshift @a, [ ];.

unshift @a, [ ]; $a[0][0]=4; $a[0][1]=5; $a[0][2]=6;

or

unshift @a, [ 4, 5, 6 ];
[ ] creates an anonymous array and returns a reference.