有人知道为什么会这样吗?
$ perl -e '@arr = []; print "HELLO." unless grep {/asdf/ =~ $_} @arr;'
输出:
HELLO.
但是
$ perl -e '@arr = undef; print "HELLO." unless grep {/asdf/ =~ $_} @arr;'
什么都不输出。
对我而言,似乎两者都应输出“你好。”
答案 0 :(得分:9)
您的代码中存在一些语法错误,这些错误会导致意外结果。
首先,如果你想要一个空数组,你需要写:
# 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;'
如果您进行了这两项更改,代码将按预期执行。
答案 1 :(得分:2)
我认为你想要grep {$ _ =〜/ asdf /}。 =〜左侧的值是要匹配的值,右侧是正则表达式。这可以进一步简化为grep {/ asdf /},因为默认搜索$ _。
如上所述,您尝试将undef模式与正则表达式值进行匹配。当模式为undef时,匹配运算符(我相信)总是返回true。