Perl трехточечный оператор... примеры
Может ли кто-нибудь показать с некоторыми примерами точную разницу между оператором ..
и ...
?
На странице perlop:
Если вы не хотите, чтобы он проверял правый операнд до следующего как и в sed, просто используйте три точки ( "..." ) вместо двух.
Но что именно это означает? Я не понимаю пример perlop:
@lines = (" - Foo",
"01 - Bar",
"1 - Baz",
" - Quux"
);
foreach (@lines) {
if (/0/ .. /1/) {
print "$_\n";
}
}
с ...
напечатает Baz
- но почему? Точнее, почему Baz
не печатается с двумя точками и только с ...
?
Ответы
Ответ 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, я рекомендую вам прочитать ее.
Подводя итог:
Одна точка
Две точки
Три точки
-
Яда-яда:
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
}
В других ответах более подробно рассказывается о различии между двумя операторами триггера.