ifブロックとif修飾子でのスコープの違い

今更ながら気づいたのでメモ。

まず、ブレースで処理文を囲んだ普通のif分岐。

my $flag = 1;

if ( $flag ) {
    my $lexical_str = "hoge";
}
print $lexical_str."\n";

上記のコードはuse strictで以下のようなエラーになります。

Global symbol "$lexical_str" requires explicit package name at ./test.pl line 11.

しかし、if修飾子を使った場合は$lexical_strは$flagと同じスコープとなり、正常に"foo"が標準出力されます。

my $flag = 1;

my $lexical_str = "foo" if $flag;
print $lexical_str."\n";

これはunlessでも同様のようです。