Подтвердить что ты не робот

Perl трехточечный оператор... примеры

Может ли кто-нибудь показать с некоторыми примерами точную разницу между оператором .. и ...?

На странице perlop:

Если вы не хотите, чтобы он проверял правый операнд до следующего как и в sed, просто используйте три точки ( "..." ) вместо двух.

Но что именно это означает? Я не понимаю пример perlop:

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

с ... напечатает Baz - но почему? Точнее, почему Baz не печатается с двумя точками и только с ...?

4b9b3361

Ответ 1

& LAQUO; ... & RAQUO; не выполняет проверку флопа сразу после истинной проверки флип.

С .. & raquo;,

  • " - Foo"
    • /0/ возвращает false.
    • .. возвращает false.
  • "01 - Bar"
    • /0/ возвращает true. Флип!
    • /1/ возвращает true. Флоп! & LARR;
    • .. возвращает true (поскольку первая проверка была правдой).
  • "1 - Baz"
    • /0/ возвращает false.
    • .. возвращает false.
  • " - Quux"
    • /0/ возвращает false.
    • .. возвращает false.

С ... & raquo;,

  • " - Foo"
    • /0/ возвращает false.
    • ... возвращает false.
  • "01 - Bar"
    • /0/ возвращает true. Флип!
    • ... возвращает true.
  • "1 - Baz"
    • /1/ возвращает true. Флоп!
    • ... возвращает true.
  • " - Quux"
    • /0/ возвращает false.
    • ... возвращает false.

Ответ 2

Если у вас есть такие случаи, как /start/ .. /end/ с вводом

start some text end
start
some other text
end

Оператор .. обрабатывает end в первой строке, как только он его считывает, и будет печатать только some text. Оператор ... не обрабатывает end в первой строке, поэтому другой текст также будет напечатан. В основном вы можете избежать остановки диапазона, если конечное значение совпадает с той же строкой, что и начало. ... откладывает проверку до следующей итерации.

Ответ 3

Повторяя здесь пример:

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

Это сложно... что происходит, когда вы используете 2 точки .., так это то, что когда вы достигаете "01 - Bar", оба условия тестируются и оба успешно (потому что эта строка имеет 0, а также 1). Таким образом, ваша печать включена и сразу отключена.

Однако, когда вы используете ..., первое условие выполняется успешно, но второе не проверяется до следующей итерации цикла, поэтому "01 - Bar" включает его, а "1 - Baz" отключает его. Таким образом, вы видите обе строки, напечатанные.

Сложная часть состоит в том, чтобы понять, что "01 - Bar" удовлетворяет обоим тестам.

Ответ 4

Статья

Там есть большая статья под названием Точки и Perl, я рекомендую вам прочитать ее.

Подводя итог:

Одна точка

  • Оператор конкатенации:

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

Две точки

  • Оператор диапазона:

    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/;
    }
    

Три точки

  • Яда-яда:

    sub example {
        ...
        # throws "Unimplemented" exception when called
    }
    
  • Флип-флоп-оператор, трехточечная версия:

    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
    }
    

В других ответах более подробно рассказывается о различии между двумя операторами триггера.