`my($ h,@ s)= @_;`和`my($ h,@ ss)= grep $ _,@ _之间的区别是什么?

时间:2015-11-17 08:58:13

标签: perl grep

我在一本名为'High-order Perl`的书中读到了这段代码,我只是不明白为什么要使用grep,但是如果我改成第一个语句,事情就会出错,有人可以解释一下吗一点点?感谢。

上下文:代码位于第6章和第5节的

sub union {
my ($h, @s) = grep $_, @_;
  return unless $h;
  return $h unless @s;
  node(head($h), promise {
  union(@s, tail($h));
 });
}

2 个答案:

答案 0 :(得分:12)

my ($h, @s) = @_;获取数组@_的第一个值并将其放在$h中,其余值放在@s中。

my ($h, @s) = grep $_, @_;获取第一个真值,并将其放入$h和其他真值,并将其放入@s

perl中的真值是不是空字符串'',0或undef。

的东西

答案 1 :(得分:2)

鉴于两个陈述之间的区别在于使用grep函数,我建议您回答问题的好地方是阅读the documentation for grep。< / p>

  

grep BLOCK LIST

     

grep EXPR,LIST

     

这与grep(1)及其相似,但不一样   亲戚们。特别是,它不限于使用常规   表达式。

     

评估LIST的每个元素的BLOCK或EXPR(本地设置   $_到每个元素)并返回由这些元素组成的列表值   表达式求值为true的元素。在标量中   context,返回表达式为真的次数。