Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re: shift in list context buggy?

by BrowserUk (Patriarch)
on Nov 09, 2013 at 16:29 UTC ( [id://1061837]=note: print w/replies, xml ) Need Help??


in reply to shift in list context buggy?

The problem here is that you are trying to use the return value of shift to determine if the array is empty. And since you appear to want undef to be "a legal value", there is no value that shift could return to indicate that the array is now empty.

The problem is avoided - or rather you avoid creating a problem -- by making the loop condition test the actual condition -- whether the array is empty -- and not conflating it with an operation that is unrelated to that condition:

while( @array ) { my $x = shift @array; # use $x. }

This isn't a "Perl design decision" to be regretted; it's a programmer error to be avoided.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
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.

Replies are listed 'Best First'.
Re^2: shift in list context buggy?
by LanX (Saint) on Nov 09, 2013 at 16:56 UTC
    > This isn't a "Perl design decision" to be regretted; it's a programmer error to be avoided.

    nope it's inconsistent, and any breach of orthogonality is a pain in the *ss and should at least be better documented.

    > And since you appear to want undef to be "a legal value", there is no value that shift could return to indicate that the array is now empty.

    So according to you, the demonstrated code using splice is a programmers error!

    Of course shift should return an empty array which is false.

    And of course ($x)=() would result in $x=undef without being true. This would be consistent with Perl's usual behavior.

    DB<196> $x=42 => 42 DB<197> ( ($x) = () ) ? "$x" : "false" => "false" DB<198> $x => undef

    Please read the code examples already given before replying.

    Cheers Rolf

    ( addicted to the Perl Programming Language)

    update

    expanded code

      So according to you, the demonstrated code using splice is a programmers error!

      WTF did you dream that incomprehensible conclusion up from?

      It is neither stated nor implied, nor logically derivable from anything I posted.

      You just made it up in an attempt to misdirect.

      Of course shift should return an empty array which is false.

      Why "of course"?

      splice can return multiple values, so when it has nothing to return, it makes sense to return an empty list.

      Conversely, shift can only ever return a single value; so why would it ever return a list. Even an empty one.

      Of course, it could return an empty list, and that would allow your construct to 'work'.

      But it doesn't and never has! And -- other than to make your peculiar construct work -- there is no reason why it should.

      Thus, it is your construct that is at fault.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      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.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (4)
As of 2024-04-19 21:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found