後置ifでmy宣言しちゃダメ
perlのスコープは{}ブロック毎に出来ます。
例えばこんな感じ。
my $flg = 1; if ( $flg ) { my $hoge = 'sasakure'; print $hoge; # output「sasakure」 } print $hoge; # Global symbol "$hoge" requires explicit ...<省略>
{}ブロック内で宣言されたmy変数は、そのブロック(スコープ)の外で使えません。
では後置ifではどうなるかというと
my $flg = 1; my $hoge = 'sasakure' if $flg; print $hoge; # output「sasakure」
{}ブロックが無いので、ifの外でも使う事が出来る。(と思ったけど、少し違うので最後まで読んでください)
それではifの評価がfalseになる場合はどうなるでしょうか。
my $flg = 0; my $hoge = 'sasakure' if $flg; print $hoge; # Use of uninitialized value ...<省略>
あれ、このエラーって変数の値が未定義の時に出るエラー。。。。
# Global symbol "$hoge" requires explicit ...<省略>
こういうのを予想してたのに、、
hogeのmy宣言はされている?
下記 perldoc引用
http://perldoc.jp/docs/perl/5.14.1/perlsyn.pod
注意: (my $x if ... のような) 条件構造やループ構造で修飾された my 文の振る舞いは 未定義 です。 my 変数の値は undef かも知れませんし、以前に代入された値かも 知れませんし、その他の如何なる値の可能性もあります。 この値に依存してはいけません。 perl の将来のバージョンでは現在のバージョンとは何か違うかも知れません。 ここには厄介なものがいます。
要するに後置ifでmy宣言しちゃダメという事だそうです。