为什么当我在未定义的数组上进行grep时会发生这种情况?

时间:2011-02-24 22:47:38

标签: perl grep

有人知道为什么会这样吗?

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

输出:

HELLO.

但是

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

什么都不输出。

对我而言,似乎两者都应输出“你好。”

2 个答案:

答案 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。