Beefy Boxes and Bandwidth Generously Provided by pair Networks Frank
Don't ask to ask, just ask
 
PerlMonks  

Re: Annoying 'Use of uninitialized value in concatenation' warning

by Perlbotics (Abbot)
on Oct 25, 2011 at 20:06 UTC ( #933689=note: print w/ replies, xml ) Need Help??


in reply to Annoying 'Use of uninitialized value in concatenation' warning

You can silence the warning (if you know what you do) or you can detect and treat the undef-case. However, it is wise to keep the no warnings; scope small. Update: See also johngg's hint below about the do{ ... } trick.

When in doubt, I suggest to treat the undef-case, and let the warning pragma do its job. Often, an undef warning reveals a bug that was otherwise undetected.

use strict; use warnings; sub original_post { my @some_array = (1, 2, undef, 4, 5); for (my $ii=0; $ii < scalar(@some_array); $ii++) { print "Value at position $ii: $some_array[$ii]\n"; } } sub detect_undef_and_set { my @some_array = (1, 2, undef, 4, 5); #alternative-1: fix data structure # @some_array = map { $_ // '(oops! undef!!)' } @some_array; for (my $ii=0; $ii < scalar(@some_array); $ii++) { #alternative-2: fix output print "Value at position $ii: ", $some_array[$ii] // '(oops! undef +!)' , "\n"; } } sub no_warnings { my @some_array = (1, 2, undef, 4, 5); for (my $ii=0; $ii < scalar(@some_array); $ii++) { no warnings 'uninitialized'; # for this lex scope only print "Value at position $ii: $some_array[$ii]\n"; } } print "ORIG:\n"; original_post(); print "CHECK:\n"; detect_undef_and_set(); print "NO WARN:\n"; no_warnings(); __DATA__ RIG: Value at position 0: 1 Value at position 1: 2 Use of uninitialized value $some_array[2] in concatenation (.) or stri +ng at nowarn.pl line 7. Value at position 2: Value at position 3: 4 Value at position 4: 5 CHECK: Value at position 0: 1 Value at position 1: 2 Value at position 2: (oops! undef!) Value at position 3: 4 Value at position 4: 5 NO WARN: Value at position 0: 1 Value at position 1: 2 Value at position 2: Value at position 3: 4 Value at position 4: 5


Comment on Re: Annoying 'Use of uninitialized value in concatenation' warning
Select or Download Code
Re^2: Annoying 'Use of uninitialized value in concatenation' warning
by johngg (Abbot) on Oct 25, 2011 at 23:35 UTC

    You can confine the no warnings 'uninitialised'; to the lexical scope but you can make it even tighter if you wish by confining it to the print with the use of a do block.

    for (my $ii=0; $ii < scalar(@some_array); $ii++) { print do { no warnings 'uninitialized'; # for the do block only "Value at position $ii: $some_array[$ii]\n"; }; }

    I hope this is of interest.

    Cheers,

    JohnGG

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://933689]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (8)
As of 2014-04-18 12:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (466 votes), past polls