in reply to Getting data out of __DATA__ and __END__

How about a one-liner?

print join(' / ', split(" ", $_) ), "\n" while <DATA>;

Replies are listed 'Best First'.
Re: Re: Getting data out of __DATA__ and __END__
by George_Sherston (Vicar) on Sep 10, 2001 at 20:42 UTC
    Hmmm. /me scratches head. Sorry if this is getting OT, but earlier in this thread John M. Dlugosz pointed out that my original formulation, my @ary = split (" ",$_) while (<DATA>) doesn't work because the magical assignment to $_ only happens in a regular while loop, not in a statement modifier. And of course, he's quite correct. But why, then, does your version work? What's the difference? Do I need to change my aftershave?

    Update: Looks like that wasn't the problem with my original formulation. Well, the problem's solved, for which again thanks. But I'd still be very interested to know why my version didn't work.

    § George Sherston
      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.