вопрос о триггере / счетчике чтения

Чтение этого Perl: извлечение строк от 1 до n (Windows) Я не понял, что такое триггер-оператор / счетчик чтения.

perl -nE 'say $c if $c=1..3' my_file 

1
2
3E0

Может ли кто-нибудь более подробно объяснить мне, откуда этот вывод?


person sid_com    schedule 01.11.2010    source источник
comment
См. perldoc perlop в разделе «Операторы диапазона». В этом вопросе также подробно обсуждается: stackoverflow.com/questions/3365053/   -  person Ether    schedule 01.11.2010


Ответы (1)


Чтобы процитировать perlop:

В скалярном контексте «..» возвращает логическое значение. Этот оператор является бистабильным, как триггер, и имитирует оператор диапазона строк (запятую) в sed, awk и различных редакторах. Каждый оператор «..» поддерживает собственное логическое состояние даже при вызовах подпрограммы, которая его содержит. Он ложен, пока его левый операнд ложен. Как только левый операнд становится истинным, оператор диапазона остается истинным до тех пор, пока правый операнд не становится истинным, ПОСЛЕ чего оператор диапазона снова становится ложным. Оно не становится ложным, пока не будет вычислен следующий оператор диапазона. Он может проверить правильный операнд и стать ложным при той же оценке, что он стал истинным (как в awk), но он все равно возвращает истину один раз. Если вы не хотите, чтобы он проверял правильный операнд до следующей оценки, как в sed, просто используйте три точки ("...") вместо двух. Во всем остальном «...» ведет себя так же, как «..».

Правый операнд не оценивается, пока оператор находится в состоянии «ложь», а левый операнд не оценивается, пока оператор находится в состоянии «истина». Приоритет немного ниже, чем у || и &&. Возвращаемое значение представляет собой либо пустую строку для false, либо порядковый номер (начинающийся с 1) для true. Порядковый номер сбрасывается для каждого обнаруженного диапазона. К последнему порядковому номеру в диапазоне добавлена ​​строка "E0", которая не влияет на его числовое значение, но дает вам что-то для поиска, если вы хотите чтобы исключить конечную точку. Вы можете исключить начальную точку, дождавшись, пока порядковый номер станет больше 1.

Если любой из операндов скаляра «..» является константным выражением, этот операнд считается истинным, если он равен (==) текущему номеру строки ввода (переменная $.).

(курсив мой)

person cjm    schedule 01.11.2010