This seems to be a bug in Data::Dumper. With the perl debugger (before the grep, thanks tye):
main::(-:1): my @matrix = ();
DB<1> n
main::(-:2): $matrix[2]->[3] = "What's goin' on?";
DB<1> n
main::(-:3): grep {/Huh?/}@$_ for @matrix;
DB<1> print @matrix
ARRAY(0x8103f2c)
DB<2> x @matrix
0 undef
1 undef
2 ARRAY(0x8103f2c)
0 empty slot
1 empty slot
2 empty slot
3 'What\'s goin\' on?'
DB<3>
With Data::Denter:
Before grep:
@
?
?
@
?
?
?
What's goin on?
After grep:
@
@
@
@
?
?
?
What's goin on?
... indicating undef (?) before the grep, as normal, and empty array refs (@) after the grep, as normal due to autovivification upon array dereference. Only Data::Dumper seems to get it wrong, or at least what seems to be wrong.