9

私はPerlを本当に知らないので、フレンドリーな検索エンジンの助けを借りてPerlスクリプトを拡張してきました。

条件が真になった場合、フラグを設定しているときにループから抜け出す必要があることがわかりました。

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

'last'を使用するより良い方法は次のようなものであることを私は知っています:

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

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

これを行うためのよりクリーンな方法はありますか?

4

4 に答える 4

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;

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

于 2011-09-07T13:28:58.800 に答える
7

私はネイサンに同意します。見栄えの良いコードはきれいですが、読みやすいバージョンの方が優れている場合もあります。しかし、それの地獄のために、ここに恐ろしいバージョンがあります:

last if $flag = $costly_condition;

=等式の代わりに割り当てを使用していることに注意してください==。割り当ては、にある値を返します$costly_condition

もちろん、これは作成されませんが$flag = 1、何でもかまいません$costly_condition。しかし、それは真実である必要があるので、そうなるでしょう$flag。これを改善するには、Zaidがコメントで述べたように、次を使用できます。

last if $flag = !! $costly_condition;

前述のように、かなり恐ろしい解決策ですが、機能します。

于 2011-09-07T13:51:00.380 に答える
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;
}
于 2011-09-07T13:35:00.160 に答える
0

これは可能ですが、強くお勧めしません。このようなトリックは、コードの可読性を低下させます。

foreach my $element (@array) {
    $flag = 1 and last if $costlyCondition;
}
于 2011-09-07T20:06:04.453 に答える