in reply to split, Use of uninitialized value

I wrote the following test and ran it under version 5.005_03 of perl. It showed that the warning was on the print line before the if. Printing undef will result in the warning.

#!/usr/bin/perl -w use strict; use Data::Dumper; use constant index1 => 0; use constant index2 => 1; my $rec = [ undef, 1 ]; print Dumper($rec); # inspect before if print "$rec->[index1] $rec->[index2]\n"; # warnings here (line 11) if ( defined $rec->[index1] && $rec->[index1] ne '' && defined $rec->[index1] && $rec->[index1] eq '1' ) { print "OK\n"; } else { print "Not OK\n"; } print Dumper($rec); # and check again after if
I don't think your if test will 'autovivify' anything because of the short circuit behaviour of the && operator. has anything to do with autovivification at all, given that the $rec has a fixed number of records. See pg's comments above and below.

$VAR1 = [ undef, 1 ]; Use of uninitialized value at ./p09.pl line 11. 1 Not OK $VAR1 = [ undef, 1 ];

Replies are listed 'Best First'.
Re: Re: split, Use of uninitialized value
by pg (Canon) on Jan 07, 2004 at 03:49 UTC
    "I don't think your if test will autovivify anything because of the short circuit behaviour of the && operator."

    It is true there is no autovivification, but it certainly has nothing to do with short circuit. If it should cause any autovivification, the first defined() call already triggered it, certainly no need for that 'ne' after the && to carry it out.

    What autovivification says is that, read/test a non-exist element of a container, creates the ancestors of that node automatically. This is obviously not what is going on here.

Re: Re: split, Use of uninitialized value
by Anonymous Monk on Jan 07, 2004 at 03:54 UTC

    Some definitions ...

    use constant IMP_WG => 18; use constant CSC_HAN => 19;

    And a dumped record with some data blanked out.

    CSC.MIDRANGE.SERVER.SUPPORT 1 $VAR1 = [ 618, 'xxxxxxxxxx', '3-Moderate', 'Normal', 'Closed', 'xxxxxxxxxx', 'xxxxxxxxxx', 'Approved', 'Approved', '05/12/03 10:00', '02/12/03 09:45', '3.00', 'Successful', '12/12/03 09:53', '05/12/03 13:00', '05/12/03 09:52', 'Midrange', 'Production', 'CSC.MIDRANGE.SERVER.SUPPORT', 1 ]; Use of uninitialized value at stats2 line 192.

    As far as I can see in all cases the data I am testing does exist. I previously had the final test as $rec->[CSC_HAN] == 1 but that was one of the first things that I changed.

    I cant see any scope for autovivification either ... the only possibility would be $rec but then the print statement should be throwing the uninitialised value errors.

    If it matters (and it probably does with something this weird) $rec is a local copy of a pointer stored in a hash and obtained like so:

    my $rec = $change_recs{$key};
      What's SRV_PLT defined as?

      I defined a new out of range index3 in the following example -
      #!/usr/bin/perl -w #use strict; use Data::Dumper; use constant index1 => 18; use constant index2 => 19; use constant index3 => 20; my $rec = [ 618, 'xxxxxxxxxx', '3-Moderate', 'Normal', 'Closed', 'xxxxxxxxxx', 'xxxxxxxxxx', 'Approved', 'Approved', '05/12/03 10:00', '02/12/03 09:45', '3.00', 'Successful', '12/12/03 09:53', '05/12/03 13:00', '05/12/03 09:52', 'Midrange', 'Production', 'CSC.MIDRANGE.SERVER.SUPPORT', 1 ]; # @$rec = map { defined($_) ? $_ : '' } @$rec; # print Dumper($rec); if ( defined $rec->[index1] && $rec->[index1] ne '' && defined $rec->[index2] && $rec->[index2] eq '1' ) { if ($rec->[index3] == 1) { print "Crap\n" }; # +39 print "$rec->[index1] $rec->[index2] ", $rec->[index3], "\n"; # +40 print "OK\n"; } else { print "Not OK\n"; } # print Dumper($rec);

      And the output of an out of range index3:
      Use of uninitialized value at ./p09.pl line 39. Use of uninitialized value at ./p09.pl line 40. CSC.MIDRANGE.SERVER.SUPPORT 1

        D'oh

        Field 20 ... and commenting it out stops the error ... but I don't understand why the error message consistantly pointed at the if statement. If anyone can elucidate this I would love to hear the answer otherwise thankyou everyone for your efforts.