2011-09-07 5 views
9

私はPerlを知らないので、友好的な検索エンジンの助けを借りてPerlスクリプトを強化しています。このPerlループの中で条件付きで最後に使用するクリーナーはありますか?

foreach my $element (@array) { 
    if($costlyCondition) { 
     $flag = 1; 
     last; 
    } 
} 

私は「最後の」使用するためのよりよい方法は、このようなものであることを知っている:

私は条件が叶うならばフラグを設定しながら、私はループから抜け出す必要があることがわかり

foreach my $element (@array) { 
    last if ($costlyCondition); 
} 

もちろん、私は構文的な砂糖を楽しむことができますが、私はループ内にフラグを設定できません。つまり、もう一度$costlyConditionを評価する必要があります。

これを行うクリーナー方法はありますか?

+6

「if」は実際には1つのステートメントのみです。最初の条件文は、複数の文が1つの条件文に適しています。 –

+0

この場合、ifブロックがより良い選択肢だと思います。ループコントロールの後置条件の通常の引数は、より重要なコードを左に置きます。ループには、終了条件とは異なる複数の終了条件があることを強調します。この場合、いくつかの複合式を使用すると、ループ制御が式の中に埋もれて、一目でわかりにくくなります。 –

+0

@Joel:そうです。私は元のバージョンにとどまります。 – ArjunShankar

答えて

21

あなたがdo {...}ブロックを使用することができます。

do {$flag = 1; last} if $costlyCondition 

あなたがステートメントに参加する,演算子を使用することができます。

$flag = 1, last if $costlyCondition; 

あなたは論理的に同じことを行うことができます&&オペレーター:

(($flag = 1) && last) if $costlyCondition; 

またはさらに低い優先順位and:一日の終わりに

(($flag = 1) and last) if $costlyCondition; 

、これらのいずれかを行うには本当の理由はありません。それらはすべて元のコードとまったく同じです。元のコードが機能して読みやすい場合は、そのままにしておきます。

+0

'$ flag = 1と$ costlyCondition;をあなたのツールシェルフに追加します。 2番目の例では –

+0

、{}を削除します。彼らは必要ではありません。 – ysth

+0

私は新しいperlの構文を学ぶ! (行う)。ありがとう!あなたとほとんどの人が言ったように、コードをそのまま保つのが最善です。 – ArjunShankar

5

出口点に応じて異なる値を返すサブルーチンでループを実行するのが1つ考えられます。

my $flag = check_elements(\@array); 

# later... 

sub check_elements { 
    my $arrayref = shift; 
    for my $ele (@$arrayref) { 
    return 1 if $costly_condition; 
    } 
    return 0; 
} 
7

は、私はきちんと見ているコードがきちんとしている間、時々読めるバージョンが優れていること、ネイサンに同意します。

last if $flag = $costly_condition; 

ではなく、平等==の割り当て=の使用に注意してください:ちょうどそれの地獄のために、しかし、ここで恐ろしいバージョンがあります。代入は$costly_conditionにある値を返します。

これはもちろん$flag = 1となりますが、$costly_conditionとはなりません。しかし、それが真実である必要があるので、$flagもそうです。それを解決するには、することができます - ザイドはコメントで述べたように - 使用:述べたように

last if $flag = !! $costly_condition; 

、かなり恐ろしいソリューションが、彼らは仕事をします。

+4

'最後に$ flag = !! $ costly_condition;はそのトリックをやるだろう;) – Zaid

+0

@zhe Hehe、ええ、私もそれを見た。 – TLP

+0

これをさらに悪化させる: '最後に$ flag =! $ costly_condition';) – pavel

0

これは可能ですが、お勧めしません。このような方法はコードの可読性を低下させます。

foreach my $element (@array) { 
    $flag = 1 and last if $costlyCondition; 
} 
関連する問題