Как разное поведение, если только и «если!» Заявление влияет на диапазон оператора в скалярном контексте?
-
25-09-2019 - |
Вопрос
На http://novosial.org/perl/one-iner/ Я нашел следующие два одноклассника. Выходы разные, потому что unless
Заявление отличается от if !
(Из-за ассоциативности и правил приоритетов).
Файл CAT: Foo Bar
Perl -ne 'Print, если только /^$/../^$/' Файл foo bar
Perl -ne 'Распечатать, если! /^$/../^$/ 'file foo bar
Как другое поведение if !
Создание второго вкладыша выведите одну пустую пустую линию?
Решение
По словам связанной статьи, это вопрос ассоциативности и приоритета ...
print unless /^$/../^$/
эквивалентно print if !(/^$/../^$/)
print if ! /^$/../^$/
эквивалентно print if (!/^$/)../^$/
Обратите внимание, что первый отрицает выражение диапазона, а второй отрицает начальное состояние диапазона, но не сам диапазон.
Другие советы
Ответ, ИМХО, это то, что нет if !
Заявление в Perl: есть if
заявление и есть !
оператор. То !
Оператор не связывается с if
; Это действует на его аргумент. Если вы начнете думать в этих условиях, ваша жизнь будет легче.
Итак, в вашем случае у вас есть,
do_something() unless something;
а также
do_something() if something-else;
Давайте поставить в нормально невидимые скобки:
do_something() unless ( something );
а также
do_something() if ( something-else );
В этом случае вы пытались написать something-else
так что ценность правды этого состояния эквивалентна истине something
, но не удалось учитывать тот факт, что !
Оператор крепко связывает.
Вот почему есть not
.
Пытаться
perl -ne 'print if not /^$/../^$/' file
Видеть not
в Perldoc Perlop:
Одинарный
not
Возвращает логическое отрицание выражения направо. Это эквивалент!
За исключением очень низкого приоритета.
Тест диапазона вернет True до того времени, что 2-й операнд верно. Затем он вернет ложь на следующий звонок.
Этот фрагмент говорит нам, что возвращается оператор диапазона
perl -ne "$x= ( ! /^$/../^$/ ) ; print qq/$x : $_/" range_test.TXT
который производит
1 : foo
2E0 :
:
:
1 : bar
Таким образом, первая пустая строка генерирует настоящий ответ, следующий ложный