I hope this doesn't come out wrong but...
Where are people getting this "$_ only happens in a regular while loop stuff? I would like to see a reference. I routinely use one liners like print while (<>). I think this might be confussion with the $_ magic assignment only happens in a while loop when using the <> operator. Can anyone correct me on this?
BTW I <e>really</e> liked demerphq's
my @words = map { split " ",$_ } <DATA>;
solution. Ugh, Zog say map gooood.
I also subscribe to the unsubstantiated opinion that a statement like
my @ary = split (" ", $_) while (<DATA>);
is exactly like
while (<DATA>) {
my @ary = split (" ", $_);
}
which would kinda explain this behavior.
again, I would love to be corrected on this and shown the errors of my ways.
I'm a sinner! Ira punnishes his wicked flesh bad, bad flesh.
After running some code samples I have no answers but only questions.
So clearly the my declaration of array is *not* local to some implicit scope because use strict doesn't complain when you access it later in the file. And so I used the Dump procedure from Devel::Peek and the plot thickened...
use strict;
use warnings;
use Devel::Peek;
my @array = split (" ", $_) while (<DATA>);
print Dump(\@array);
__DATA__
ksg gae agdg ekau eg
Gke geo g ep ge
Gave me...
SV = RV(0x1a97584) at 0x1a7f0bc
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x1a72ffc
SV = PVAV(0x1a7dd3c) at 0x1a72ffc
REFCNT = 2
FLAGS = (PADBUSY,PADMY)
IV = 0
NV = 0
ARRAY = 0x1a7012c
FILL = -1
MAX = 4
ARYLEN = 0x0
FLAGS = (REAL)
Note that MAX is 4? When I do this on an empty, never accessed array MAX is -1. So I think that somewhere along the way @array got 4 elements assigned to it. But that's also weird because there should have been 5.
Any hubris I had is now confussion. All is lost... all is lost...
Ira.
|