http://qs1969.pair.com?node_id=1217204


in reply to Any downsides to this slurp idiom?

If the file you're slurping has any size, you're better to do:

my $s; do{ local( @ARGV, $/)='big.file'; $s = <> };
than
my $s = do{ local( @ARGV, $/)='big.file'; <> };

As the latter makes two copies of the file. One in a temporary, and then a copy in $s.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority". The enemy of (IT) success is complexity.
In the absence of evidence, opinion is indistinguishable from prejudice. Suck that fhit

Replies are listed 'Best First'.
Re^2: Any downsides to this slurp idiom?
by vr (Curate) on Jun 22, 2018 at 17:55 UTC

    That's for 5.18 and older versions of Perl. Perhaps related somehow to COW becoming default in 5.20, same mechanism of optimization.

      I'm sorry to ask but I'm interested and not sure I follow. Are you saying that BrowserUk's two examples are equivalent in the background with 5.20 and up? Copy on write being used to make the "temporary" data the same as the scalar's?

        Correct. I'm observing, right now, memory consumption reading 400 MB file using both examples, both in 5.18 and 5.20. And trying to read 800 MB file results in "Out of memory!" (32-bit OS) with 5.18 and $s = do{...}; syntax, but not in other 3 cases. I said "somehow" because scalar doesn't get "IsCOW" flag, but mechanism (do not copy a buffer PV points to) must perhaps be the same.

      That sounded plausible, but I just tried it on 5.22 with these results, using this code in my repl:

      { my $s; do{ local( @ARGV, $/)='1gb.db'; $s = <> }; <STDIN>; my $t = do{ local( @ARGV, $/)='1gb.db'; <> }; <STDIN> };;

      Note how the first bump in the memory to 1.2GB remains at that level after the first burst of IO finishes,

      It then climbs to 2.4GB for the second burst of IO, and then climbs again to 3.5GB immediately the IO stops.

      Ie. When the temporary buffer within the do block is copied into the target scaler $t.

      (Perhaps the IsCOW only operates on *nix? (I'm on win.)


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority". The enemy of (IT) success is complexity.
      In the absence of evidence, opinion is indistinguishable from prejudice. Suck that fhit
        >perl -wE "system(qq($^X -v));my$s=do{local(@ARGV,$/)='1GB';<>};system +('typeperf """\\Process(perl)\\Working Set Peak""" -sc 1')" This is perl 5, version 18, subversion 4 (v5.18.4) built for MSWin32-x +64-multi-thread Copyright 1987-2013, Larry Wall Perl may be copied only under the terms of either the Artistic License + or the GNU General Public License, which may be found in the Perl 5 source ki +t. Complete documentation for Perl, including FAQ lists, should be found +on this system using "man perl" or "perldoc perl". If you have access to + the Internet, point your browser at http://www.perl.org/, the Perl Home Pa +ge. "(PDH-CSV 4.0)","\\DESKTOP-P81QO3Q\Process(perl)\Working Set Peak" "06/23/2018 01:47:53.431","2192527360.000000"

        .

        >perl -wE "system(qq($^X -v));my$s=do{local(@ARGV,$/)='1GB';<>};system +('typeperf """\\Process(perl)\\Working Set Peak""" -sc 1')" This is perl 5, version 22, subversion 3 (v5.22.3) built for MSWin32-x +64-multi-thread Copyright 1987-2017, Larry Wall Perl may be copied only under the terms of either the Artistic License + or the GNU General Public License, which may be found in the Perl 5 source ki +t. Complete documentation for Perl, including FAQ lists, should be found +on this system using "man perl" or "perldoc perl". If you have access to + the Internet, point your browser at http://www.perl.org/, the Perl Home Pa +ge. "(PDH-CSV 4.0)","\\DESKTOP-P81QO3Q\Process(perl)\Working Set Peak" "06/23/2018 01:58:33.467","1099583488.000000"