in reply to Filehandles and Arrays

I really like:
my @array = do { local @ARGV = "foo.txt"; <> };

ar0n - swoosh ]

Replies are listed 'Best First'.
Re: (ar0n) Re: Filehandles and Arrays
by arturo (Vicar) on May 08, 2001 at 03:05 UTC

    Nice! Or, less flashy, you can just put your fav'rit routine into a sub that takes a filename as argument.

    sub slurp { my $filename = shift; open HEYNONNYNO, $filename or die "Can't open $filename: $!\n"; my @stuff = <HEYNONNYNO>; close HEYNONNYNO; [ @stuff ] }

    And you call it with my @lines = @{slurp("foo.txt.")}; Added the code tags to make that look better.

    Again, just for fun (I'm into that today).

Re: (ar0n) Re: Filehandles and Arrays
by ChemBoy (Priest) on May 08, 2001 at 04:11 UTC

    I played around with this some, and noticed that if you're reading a file off of the command line already (at least in the situations I could test) it doesn't work. Which, in my view, it should, owing to local and all. Specifically, it keeps right on reading off of the file specified on the command line, try as I might (by localizing @ARGV and $ARGV and even *ARGV, which was probably a bad idea) to dissuade it.

    Can any kind, wise, helpful monks explain why and when this will and won't work? It's a neat trick in any case, but if it could be worked as a general file-slurper without the baggage, it'd be even cooler.



    If God had meant us to fly, he would *never* have give us the railroads.
        --Michael Flanders

      Well, I'm not who you asked for so feel free to ignore me. I've said it before and it works for me: my @lines= do { local *ARGV; @ARGV= $name; <> }; I have tested it while in the middle of using <> to read from files given on the command line and it read the lines from the named file and then the next <> resumed right where it had left off.

      Perhaps you could post some code that demonstrates how it fails (as I was never completely sure that it was foolproof).

              - tye (but my friends call me "Tye")

        ChemBoy mentioned that this didn't work for him so I tested with Perl 5.004_01 and got an empty array and no error message (though subsequent <>s resumed where they had left off). ChemBoy seems to get different results from either of my tests.

        So perhaps this overly-cute hack works for 5.6 but fails in different ways for earlier versions. More data is required before I'd draw any firm conclusions, but at least isn't just my word against ChemBoy's now.

                - tye (but my friends call me "Tye")

        I kicked all of these around some, and I'm still confused. Possibly this is a local issue to me, possibly not. In summary, I got ar0n's technique to work when no file was being read from the command line (in the debugger, at least), but not the modification suggested by merlyn and tye (who I would not dream of ignoring), and neither when a file was being read. But tye says it works for him, and tye is an honorable man...

        So, below are what I did and what happened, and if I'm making a stupid mistake I'll be very happy to find out what it is. I'm only including the results trying to read from two files at once, because it's long enough already, and the other ones don't add anything much.

        For reference, This is perl, version 5.004_04 built for IP27-irix

        Pseudo-update: and it appears that it is indeed relevant. Oh, why can't they install 5.6 here?Oh well, at least I'm not confused any more. :-)

Re: (ar0n) Re: Filehandles and Arrays
by merlyn (Sage) on May 08, 2001 at 18:28 UTC