Как разное поведение, если только и «если!» Заявление влияет на диапазон оператора в скалярном контексте?

StackOverflow https://stackoverflow.com/questions/2395808

Вопрос

На 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

Таким образом, первая пустая строка генерирует настоящий ответ, следующий ложный

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top