in reply to Duh. 'my' scope in if else blocks.

It makes sense to me because the "my" is up outside of the curlies. This wouldn't work, for example:

if ( scalar( @_ ) ) { my $t = shift; $t =~ s/change_something/to_something_else/; } print "$t\n";
Parenthencies don't influence lexical scope.

Replies are listed 'Best First'.
Re^2: Duh. 'my' scope in if else blocks.
by Thilosophy (Curate) on Dec 11, 2007 at 11:14 UTC
    This won't work either, even though my $t is outside of the curlies (but inside the parens) now:
    if ( my $t = shift ) { $t =~ s/change_something/to_something_else/; } print "$t\n"; # out of scope here
    if behaves similar to for in this respect.

    Somewhat surprisingly then, this does not work:

    print $t if (my $t = shift);

      doom's explanation is wrong. It has nothing to do with order. Even if you fixed the order, it still wouldn't work.

      (my $t = shift) and print $t; # Fails.

      Variables cannot be used (by name) in the statement in which they are declared. This allows statements such as my $t = $t; to work.

      print $t if (my $t = shift); # Fails. my $t = shift; print $t if $t; # Ok. if (my $t = shift) { print $t; } # Ok.

      if behaves similar to for in this respect.

      Yes good point. I always forget about that, too... sometimes you'd like to have the loop counter defined after the loop is over, but you have to make a special effort to do that. This won't work, for example:

      my @list = qw( wuhn tew thuree foah DONE whateva you know); for my $i (0..10) { last if ($list[$i] eq 'DONE'); } print "final index: $i\n";

      Somewhat surprisingly then, this does not work:
      print $t if (my $t = shift);

      Well, I wouldn't say that that's exactly a surprise -- after all, it's a fairly odd thing to do, declaring it's a lexical after you use it... This doesn't work either:

      $t = shift; print $t; my $t;