Почему это происходит, когда я grep над неопределенным массивом? - PullRequest
3 голосов
/ 25 февраля 2011

Кто-нибудь знает, почему это происходит?

$ perl -e '@arr = []; print "HELLO." unless grep {/asdf/ =~ $_} @arr;'

Выходы:

HELLO.

Но

$ perl -e '@arr = undef; print "HELLO." unless grep {/asdf/ =~ $_} @arr;'

ничего не выводит.

Мне кажется, что оба должны вывести "HELLO".

Ответы [ 2 ]

9 голосов
/ 25 февраля 2011

В вашем коде есть пара синтаксических ошибок, которые приводят к неожиданным результатам.

Во-первых, если вам нужен пустой массив, вам нужно написать:

# Correct (creates an empty array)
my @array = ();

# Incorrect (creates a one-element array containing a reference to an empty array)
my @array = [];

# Incorrect (creates a one-element array containing the undef element)
my @array = undef;

Вам также необходимо изменить условие grep - регулярное выражение должно быть справа от оператора =~:

perl -e '@arr = (); print "HELLO." unless grep { $_ =~ /asdf/} @arr;'

Если вы сделаете эти два изменения, код будет делать то, что вы ожидаете.

2 голосов
/ 25 февраля 2011

Я думаю, что вы хотите grep {$ _ = ~ / asdf /}. Значение в левой части = ~ - это значение для сравнения, а в правой части - регулярное выражение. Это можно упростить далее как grep {/ asdf /}, потому что $ _ ищется по умолчанию.

Как написано, вы пытаетесь сопоставить шаблон undef со значением регулярного выражения. Оператор соответствия (я полагаю) всегда возвращает истину, когда шаблон не определен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...