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

Re: Re: Parsing your script's command line

by yosefm (Friar)
on Sep 04, 2003 at 11:48 UTC ( #288830=note: print w/ replies, xml ) Need Help??


in reply to Re: Parsing your script's command line
in thread Parsing your script's command line

This is because $thing could be defined but zero and we don't want to overwrite a perfectly valid zero from the command line.


Comment on Re: Re: Parsing your script's command line
Re: Re: Re: Parsing your script's command line
by Not_a_Number (Parson) on Sep 04, 2003 at 20:17 UTC

    Er...

    I'm afraid I don't understand. Under what circumstances does:

    $thing = 'default' unless defined $thing;

    not work for $thing == 0? I'm confused. Could you show me some code where the behaviour of the above differs from:

    $thing ||= 'default' unless defined $thing;

    Thanks in advance,

    dave

Re^3: Parsing your script's command line
by JadeNB (Chaplain) on Sep 07, 2008 at 20:16 UTC
    This is because $thing could be defined but zero and we don't want to overwrite a perfectly valid zero from the command line.
    As Not_a_Number points out, the syntax EXPR unless defined $thing will do nothing at all * if $thing is defined, whether it's true or false. That is, if we are executing EXPR, then $thing is guaranteed undefined, hence false; so $thing ||= 'default' is guaranteed to be the same as $thing = 'default'.

    It seems reasonable to guess that what happened is that the coder originally had $thing ||= 'default' in some old code, discovered (as you mention) that it doesn't work when $thing is false-but-defined, and added the defined check without realising that it made ||= redundant.

    Of course, a mere five years later, we have the wonderful //= (C style Logical Defined Or) instead to save us this pain.

    UPDATE (the *'d statement above—sorry, I don't know how to do footnotes): On further thought, it's not quite true that EXPR unless defined $thing will do nothing if $thing is defined. Among what I suppose are many other subtle cases, if the unless is the last line in a subroutine, it'll make the subroutine return 1 when $thing is defined. For example, after

    our $a = 1; sub b { 0 unless defined $a } sub c {} my $b = b; my $c = c;
    we have that $b = 1 but $c is undefined.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (7)
As of 2015-07-04 05:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (57 votes), past polls