29

.....演算子の正確な違いをいくつかの例で示すことができますか?

perlopのmanページから:

sedのように、次の評価まで正しいオペランドをテストしたくない場合は、2つではなく3つのドット( "...")を使用してください。

しかし、これは正確にはどういう意味ですか?perlopの例がわかりません。

@lines = ("   - Foo",
          "01 - Bar",
          "1  - Baz",
          "   - Quux"
);
foreach (@lines) {
    if (/0/ .. /1/) {
        print "$_\n";
    }
}

withは-...を印刷しますBazが、なぜですか?もっと正確に言えば、なぜBaz2つのドットだけで印刷されないの...ですか?

4

4 に答える 4

17

« ...»真のフリップチェックの直後にフロップチェックを実行しません。

« ..»で、

  1. " - Foo"
    1. /0/falseを返します。
    2. ..falseを返します。
  2. "01 - Bar"
    1. /0/trueを返します。フリップ!
    2. /1/trueを返します。フロップ!
    3. ..trueを返します(最初のチェックがtrueだったため)。
  3. "1 - Baz"
    1. /0/falseを返します。
    2. ..falseを返します。
  4. " - Quux"
    1. /0/falseを返します。
    2. ..falseを返します。

« ...»で、

  1. " - Foo"
    1. /0/falseを返します。
    2. ...falseを返します。
  2. "01 - Bar"
    1. /0/trueを返します。フリップ!
    2. ...trueを返します。
  3. "1 - Baz"
    1. /1/trueを返します。フロップ!
    2. ...trueを返します。
  4. " - Quux"
    1. /0/falseを返します。
    2. ...falseを返します。
于 2012-06-13T19:08:50.653 に答える
4

/start/ .. /end/入力のような場合があります

start some text end
start
some other text
end

..オペレーターは、最初の行を読み取るとすぐに処理し、印刷endするだけsome textです。...オペレーターは最初の行を処理しないためend、他のテキストも印刷されます。基本的に、終了値が開始と同じ行で一致する場合は、範囲の停止を回避できます。次の...反復までチェックを延期します。

于 2012-06-13T19:11:27.753 に答える
4

ここで例を繰り返します:

@lines = ("   - Foo",
          "01 - Bar",
          "1  - Baz",
          "   - Quux"
);
foreach (@lines) {
    if (/0/ .. /1/) {
        print "$_\n";
    }
}

トリッキーです...2つのドットを使用する..と、に達する"01 - Bar"と、両方の条件がテストされ、両方が成功します(その行にはとが含まれているため01。したがって、印刷はオンになり、すぐにオフになります。

ただし、を使用する...と、最初の条件は成功しますが、2番目の条件はループの次の反復まで試行されないため、"01 - Bar"オンと"1 - Baz"オフを切り替えます。したがって、両方の行が印刷されます。

トリッキーな部分は、"01 - Bar"が両方のテストを満たしていることを理解することです。

于 2012-06-13T19:14:16.967 に答える
3

記事

DotsとPerlという素晴らしい記事があります。それを読むことをお勧めします。

要約すると:

ワンドット

  • 連結演算子

    say "one" . "two";
    # Outputs "onetwo"
    

2つのドット

  • 範囲演算子

    my @numbers = (1..100); # has one hundred numbers from 1 to 100
    
  • フリップフロップ演算子

    while (my $line = readline($fh)) {
        process_this_line($line) if m/START/ .. m/END/;
    }
    

3つのドット

  • 矢田矢田声明

    sub example {
        ...
        # throws "Unimplemented" exception when called
    }
    
  • フリップフロップ演算子、3ドットバージョン

    while (my $line = readline($fh)) {
        process_this_line($line) if m/START/ ... m/END/;
        # The only difference between this and the two-dot version
        # occurs when a single line has both START and END
    }
    

他の回答では、2つのフリップフロップ演算子の違いについて詳しく説明します。

于 2014-04-09T17:05:36.433 に答える