http://www.perlmonks.org?node_id=282185

LanceDeeply has asked for the wisdom of the Perl Monks concerning the following question:

I know this code:

my $data = do { local $/; <DATA> };
slurps the __DATA__ section into my scalar $data, but what is perl doing in that do loop?

my $data = do { local $/; # localize RS? <DATA> # evaluate <DATA> in scalar context ? }
what's happenning in there?

Replies are listed 'Best First'.
Re: slurping __DATA__
by jeffa (Bishop) on Aug 08, 2003 at 14:17 UTC
    do is "not really a function". It is a block that has a seperate scope from wherever it was called from. This allows you to localize $/ so that when execution leaves our "temporary" scope, $/ will be what it was before it was changed.

    If you look up $/ in perlvar, you will see

       You may set it to a multi-character
       string to match a multi-character terminator, or
       to "undef" to read through the end of file.
    
    Finally, <DATA> returns the next line from the filehandle DATA, and since $/ is undefined, the entire contents of the file are returned and "caught" in a scalar.

    UPDATE: i should add that this is one of those few cases where local is a good choice. For example,
    local $/;
    Is essentially the same as
    local $/ = undef;
    Which is not the same as
    $/ = undef;
    Even though that last snippet will be contained inside a do block ... $/ will still be undef afterwards. Try this - make two files foo.txt and bar.txt and run this:

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    B--B--B--B--B--B--B--B--
    H---H---H---H---H---H---
    (the triplet paradiddle with high-hat)
    
      Thanks!

      I did read perldoc perlvar but I didnt know that local $/; was undef-ing it for the do's block context. I'll have to go brush up on local, 'cause I never use it.

Re: slurping __DATA__
by Zeroth (Beadle) on Aug 08, 2003 at 14:17 UTC
    See: perldoc -f do
    And read the part about "do BLOCK". That should explain it quite well.