ROUTE 3390

備忘録的な用途で書いていますが、どなたかの役に立つ事があれば嬉しいです。

後置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宣言しちゃダメという事だそうです。