in reply to slurping styles

Yes.

Cleaned up (with do ⇒ elegant):

my $raw = do { open(my $fh, '<', $file) or die("Could not read file: $!\n"); binmode $fh; local $/; <$fh> };

Cleaned up (without do ⇒ saves memory):

my $raw; { open(my $fh, '<', $file) or die("Could not read file: $!\n"); binmode $fh; local $/; $raw = <$fh>; }

Replies are listed 'Best First'.
Re^2: slurping styles
by BrowserUk (Patriarch) on Aug 01, 2008 at 12:01 UTC
Re^2: slurping styles
by massa (Hermit) on Aug 01, 2008 at 11:30 UTC
    Do you care to explain why does the do version uses 2x as much memory?
    []s, HTH, Massa (κς,πμ,πλ)

      No can do. I don't know why.

      Update: Actually, it's quite basic. The assignment of do's return value causes it to be copied. You'll notice the same effect from subroutines.

      use Devel::Peek qw( Dump ); { my $x = do { my $y = 'abcdef'; Dump($y); $y }; Dump($x); } { my $x = sub { my $y = 'abcdef'; Dump($y); $y }->(); Dump($x); } __END__ SV = PV(0x226df4) at 0x226ce0 REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x1822b04 "abcdef"\0 CUR = 6 LEN = 8 SV = PV(0x226e24) at 0x226d34 REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x187a93c "abcdef"\0 <-- new buffer CUR = 6 LEN = 8 SV = PV(0x226e0c) at 0x1830320 REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x182c84c "abcdef"\0 CUR = 6 LEN = 8 SV = PV(0x226e60) at 0x226d70 REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x1855fac "abcdef"\0 <-- new buffer CUR = 6 LEN = 8
      I'd think that do block creates an anonymous lexical variable to hold the last value, and its content is being copies to the caller.

      Try to measure the memory for returning something like [ <$handle> ], if my theory holds it won't use twice as much memory then because only the array reference is copied.