Чтение этого Perl: извлечение строк от 1 до n (Windows) Я не понял, что такое триггер-оператор / счетчик чтения.
perl -nE 'say $c if $c=1..3' my_file
1
2
3E0
Может ли кто-нибудь более подробно объяснить мне, откуда этот вывод?
Чтение этого Perl: извлечение строк от 1 до n (Windows) Я не понял, что такое триггер-оператор / счетчик чтения.
perl -nE 'say $c if $c=1..3' my_file
1
2
3E0
Может ли кто-нибудь более подробно объяснить мне, откуда этот вывод?
Чтобы процитировать perlop:
В скалярном контексте «
..
» возвращает логическое значение. Этот оператор является бистабильным, как триггер, и имитирует оператор диапазона строк (запятую) в sed, awk и различных редакторах. Каждый оператор «..
» поддерживает собственное логическое состояние даже при вызовах подпрограммы, которая его содержит. Он ложен, пока его левый операнд ложен. Как только левый операнд становится истинным, оператор диапазона остается истинным до тех пор, пока правый операнд не становится истинным, ПОСЛЕ чего оператор диапазона снова становится ложным. Оно не становится ложным, пока не будет вычислен следующий оператор диапазона. Он может проверить правильный операнд и стать ложным при той же оценке, что он стал истинным (как в awk), но он все равно возвращает истину один раз. Если вы не хотите, чтобы он проверял правильный операнд до следующей оценки, как в sed, просто используйте три точки ("...
") вместо двух. Во всем остальном «...
» ведет себя так же, как «..
».Правый операнд не оценивается, пока оператор находится в состоянии «ложь», а левый операнд не оценивается, пока оператор находится в состоянии «истина». Приоритет немного ниже, чем у
||
и&&
. Возвращаемое значение представляет собой либо пустую строку для false, либо порядковый номер (начинающийся с 1) для true. Порядковый номер сбрасывается для каждого обнаруженного диапазона. К последнему порядковому номеру в диапазоне добавлена строка "E0", которая не влияет на его числовое значение, но дает вам что-то для поиска, если вы хотите чтобы исключить конечную точку. Вы можете исключить начальную точку, дождавшись, пока порядковый номер станет больше 1.Если любой из операндов скаляра «
..
» является константным выражением, этот операнд считается истинным, если он равен (==
) текущему номеру строки ввода (переменная$.
).
(курсив мой)