in this discussion : Re^6: Using an array element as a loop iterator I was quite disappointed to find out that shift in list context can lead to an endless loop:
This will never stop:
while ( ($x) = shift @a ) { ... }
After some meditation I consider this at least a design flaw, there is only an empty list to assign to the LHS when @a is exhausted, so the condition should be false.
($x is of course undef then, but while has to check the list assignment not the scalar!)
To make things worse my tests revealed that the "equivalent" splice doesn't have the same behavior:
DB<170> @a=1..2 => (1, 2) DB<171> ( ($x) = shift @a ) ? $x : "false" => 1 DB<172> ( ($x) = shift @a ) ? $x : "false" => 2 DB<173> ( ($x) = shift @a ) ? $x : "false" => undef # true!
but
DB<174> @a=1..2 => (1, 2) DB<175> ( ($x) = splice @a,0,1 ) ? "$x" : "false" => 1 DB<176> ( ($x) = splice @a,0,1 ) ? "$x" : "false" => 2 DB<177> ( ($x) = splice @a,0,1 ) ? "$x" : "false" => "false"
according to the docs:
The following equivalences hold (assuming "$[ == 0 and $#a >= $i" ) ... shift(@a) splice(@a,0,1)
OK one might argue that $i means 0 here but I still can't understand if there is a good reason justifying this breach of analogy.
Can someone shed light on this?
I suppose it's too late to fix that in newer Perl versions w/o breaking compability ... (I used 5.10)
Cheers Rolf
( addicted to the Perl Programming Language)
In reply to shift in list context buggy? by LanX
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |