in reply to Trapping a warning

Welcome to autovivification. I've fried myself quite a few times on this as well.

Even if those reference-array entries $row->[0] and $row->[1] didn't exist before with your original code, they do exist (and are undef) after that code runs. The subsequent code is not likely to appreciate this.

To test whether $row->[0] and $row->[1] are defined without risking autovivification, use something like

if (defined($row) and defined($row->[0]) and defined($row->[1]) { # .... }

The first clause tests for whether the $row variable is defined. If that variable is defined, we proceed to test whether the 0 and 1 entries of the referenced array are defined. This also prevents being flummoxed by 0 (which is Perl-false).

Of course, do this before you start using $row->[0] and $row->[1]. After that, it's too late.

Replies are listed 'Best First'.
Re: Trapping a warning
by Abigail-II (Bishop) on Jul 04, 2002 at 11:15 UTC
    Well, if you want to check whether $row->[0] and $row->[1] exists without autovivification, just check whether $row contains any elements. $row->[0] can only exist if and only if @$row > 0. Similar, $row -> [1] only exists if and only if @$row > 1.

    Note that from 5.6.0 onwards, delete and exists work on arrays as well.

    Abigail