in reply to Re^2: blocks and using braces around filehandles with print
in thread blocks and using braces around filehandles with print

A block contains 0 or more Perl statements. A block evaluates the the last value evaluated within the block.

Examples:

{ STDOUT } -> STDOUT { $hash{$k}[$i] } -> $hash{$k}[$i] { my $x = func(); uc($x) } -> uc($x) { if ($cond) { 'FOO' } } -> If $cond is false, $cond. -> If $cond is true, 'FOO'.

Replies are listed 'Best First'.
Re^4: blocks and using braces around filehandles with print
by bramble (Beadle) on Mar 17, 2008 at 01:09 UTC
    A block contains 0 or more Perl statements. A block evaluates the the last value evaluated within the block.

    If that's the case, then why doesn't the following work?

    #!/usr/bin/env perl use strict; use warnings; my $foo = { print "hi!\n"; my $bar = 7; my $baz = 8; }; print "So, \$foo = $foo\n";

      A block can only be used where a statement is expected, in a control flow statement where a block is expected, or as an operand to an operator that expects a block.

      Some operators that accept blocks:
      do BLOCK
      map BLOCK LIST
      print BLOCK LIST
      eval BLOCK

      In your code, do would perform what you want

      my $foo = do { print "hi!\n"; my $bar = 7; my $baz = 8; };

        Thanks, ikegami!