2012-03-22 10 views
3

に「偽」だ変数に値を代入するための最良の方法は何私は、(最高の、最も効率的である何、perlの素晴らしいところは、たくさんのことを行うための複数の方法があることである、と私は思っていた知っています(0、空の文字列、)など、undefを虚偽だ変数に値を代入するための最もrealiable、より高速な)方法で、私が知っているいくつかは以下のとおりです。perlの

if (! $x) { 
    $x = 1; 
} 
# or $x = 1 if (! $x); 

$x = $x || 1; 

$x = 1 unless $x; 

$x ||= 1; 

は、より良いオプションはありますか?

+1

どのように与えられた道が別のものより「より良い」であるかどうかを判断するのでしょうか? – jwodder

+0

もっと速くなったり、失敗する可能性は低いですか? – DarkAjax

+4

私はそれらのいずれかの方法が失敗する可能性がどのように表示されていない、と何も純粋なPerlでより速く、おそらくありません.... – jwodder

答えて

6
$x ||= $default; 

は、短く、はっきりとしており、一般的に使用されています。

-3

あなたは////=事業者だけでなく(定義されたらしのためのチェック)を追加することもできます。しかし、これらのメソッドの速度の違いがあなたのプログラムにとって重要なのであれば、あなたのアルゴリズムの一部をperlの外に移動し、代わりにperlから呼び出すことができます(perlを "glue"として使用する)。

知識をひけらかす警察はコメントですべての私のお尻の上にあるので、私はベンチマークにそれを時間を要しました。ではない、世界で最も偉大なベンチマーキングプロジェクトが、それでも私は走った:私のシステムで

time perl -e 'my $a; for (1..10000000) { $a ||= $_; }; print $a;'

time perl -e 'my $a; for (1..10000000) { $a //= $_; }; print $a;'

を、//=バージョンは一貫して、5〜10%高速です。 YMMV。

元の質問の中の引用符が "偽"を意味し、厳密に偽ではないと仮定し、この文脈でundefが有効な "偽"値であると仮定すると、演算子のundefバージョンは約5-10 % もっと早く。

初期化されていない変数を初期化する最も速い方法を探していると仮定して、このレベルのperlで最適化するコメントはまだありますが、単純なベンチマークに基づいてより高速でしょう。立つ。

+3

いいえ、彼はないかもしれません。 '0 // 1'は0を返します。 – Vladimir

+0

これはスカラー0が定義されているためです。あなたのポイントは何ですか? –

+2

「0」は偽であり、OPは偽であるものを検出するように求められたので、初期値が「0」であるときに解が作用するはずである。 '//'はしないので、間違っています。それが彼の主張です。 – ikegami