in reply to Re^4: Use of uninitialized value in substr
in thread Use of uninitialized value in substr

It seems to me that there is a considerable difference between using a variable who current value is undef, and using undef explicitly.

And that, at least for built-ins that have (or could have) access to the information to know the difference, they could (and should?) be treated differently.

I'm not aware of that difference in any existing perl built-ins (except those which modify their arguments).

Introducing such a difference would only lead to questions of the form "how can I change my code so that it acts as if it were a literal, not a variable?", and no real benefit.

If I pass a varible who's current value is undef, there is a possibility that it is an accident of bad flow control. If I pass undef explicitly, I've chosen to do so.
... and you've chosen to get the warning.

I don't see why you should ever use a literal undef when you really should be using an empty string, and expect not to get a warning. I also don't see how undef would be more perlish than the empty string.

  • Comment on Re^5: Use of uninitialized value in substr

Replies are listed 'Best First'.
Re^6: Use of uninitialized value in substr
by almut (Canon) on May 03, 2010 at 13:53 UTC
    I'm not aware of that difference in any existing perl built-ins...

    open comes to mind, i.e.

    open my $fh, "+>", undef or die $!; # open a temp file

    is not the same as

    my $file = undef; open my $fh, "+>", $file or die $!;
Re^6: Use of uninitialized value in substr
by BrowserUk (Patriarch) on May 03, 2010 at 13:55 UTC
    I don't see why you should ever use a literal undef when you really should be using an empty string,

    Sorry to 'go all CS on you' :), but of all people I thought you would see the utility in distinguishing between bottom (or null; or undef) and a variable that current has length zero.

    In general, Perl is pretty good about DWIMing when we attempt to perform (legitimate) actions on variables that are currently set to undef.

    my $i; ++$i, print $i; 1

    Inventing na empty string to say that I want the target substring to be replaced by nothing just seems...clumsy.

    But it's no big deal. (Really, it isn't). Just a random thought that

    my $record = substr $data, 0, $CDRLEN, undef;
    might more clearly convey the semantics of the underlaying operation than
    my $record = substr $data, 0, $CDRLEN, '';
    And that's it. Personally, I think it does, but is currently hampered in use by the warning. And it struck me that warning could be suppressed where it is obviously a rational choice.

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.