use diagnostics; warn "row=$row col=$col row->[col]=", $row->[$col], ";\n"; __END__ Use of uninitialized value $row in concatenation (.) or string at - line 1 (#1) (W uninitialized) An undefined value was used as if it were already defined. It was interpreted as a "" or a 0, but maybe it was a mistake. To suppress this warning assign a defined value to your variables. To help you figure out what was undefined, perl will try to tell you the name of the variable (if any) that was undefined. In some cases it cannot do this, so it also tells you what operation you used the undefined value in. Note, however, that perl optimizes your program and the operation displayed in the warning may not necessarily appear literally in your program. For example, "that $foo" is usually optimized into "that " . $foo, and the warning will refer to the concatenation (.) operator, even though there is no . in your program. Use of uninitialized value $col in concatenation (.) or string at - line 1 (#1) Use of uninitialized value $col in array element at - line 1 (#1) Use of uninitialized value in warn at - line 1 (#1) row= col= row->[col]=; #### $SIG{__WARN__} = \&warn_trap; $SIG{__DIE__} = \&death_trap; ... sub warn_trap { my $warning = $_[0]; if (caller eq $WHOAMI or !splainthis($warning)) { ... sub splainthis ... print THITHER "$orig (#$old_diag{$_})\n";