Comment detail

変数の初期値 (Nested Flatten)

This comment is reply for 5952 あにす: すみません。Perlが読めません。 ”...(変数の初期値). Go to thread root.

お題投稿者ではありませんが、勝手に答えると

 my $var ||= 'foo';

というコードは$varという変数がnilのときだけ'foo'を代入するもので
「この不備」と言われているのはコード中のどこかで$varにnilが代入された場合に
上記のコード部分で望まない代入が起きることでしょう。

 $zero //= 25;

こちらのコードなら確実に一度だけの初期化が行われるようです。

このコードの使い道は、と言えば、Cにおける手続き内でのstatic変数の同等機能の実現などが
考えられます。

という解釈の元に#5950を投稿しましたが、全然外してたりして。
つまり定数を宣言すればよいということでしょうか…。
const string hoge = "piyo";
これだと宣言時に値が確定してないときには具合が悪いですね。
こんなのはどうでしょう?

わかりにくいですね…。
1
2
string hoge;
hoge = hoge == "" ? "piyo" : hoge;
すみません。これだとコンパイル出来ませんね。
1
2
string hoge = "";
hoge = hoge == "" ? "piyo" : hoge;
> my $var ||= 'foo';
>というコードは$varという変数がnilのときだけ'foo'を代入するもので

 であれば余り問題は無いのですが,このコードは以下のコードと同じ意味になります。

my $var = $var || 'foo'; #||は短絡演算子

 問題中にある様に変数の宣言と一緒にやる場合には然程問題になりませんが,perlでは0は偽として評価されるので,値が設定されていない場合に初期値を設定する意図で使用するケースで,以下の様に問題が出る場合があるのです。

my $var;
[..snip..]
$var = 0;
[..snip..]
$var ||= 1; #0が設定されている場合は0のままとするつもり

Index

Feed

Other

Link

Pathtraq

loading...