如果移动到数组的最后一个元素之外,有什么值?

时间:2013-06-05 20:20:36

标签: arrays perl null shift undef

在这段代码中,shift使用了两次,即使该方法只接受一个参数:

sub regexVerify ($)
{
   my $re = shift;

   return sub
   {
      local $_ = shift;
      m/$re/ ? $_ : undef;
   };
}

如果再次使用shift,这会使本地$ _的值变为什么?我(也许是天真的)假设变成虚无会导致undef。但如果这是真的,这条线没有意义,对吧?:

m/$re/ ? $_ : undef;

上面的子被称为:

regexVerify (qr/^([a-z].*)?$/i);

2 个答案:

答案 0 :(得分:2)

第二个shift位于内部sub声明中。该范围将使用全新的@_,这与传递给外部子例程的@_无关。

regexVerify是一个返回另一个子程序的子程序。据推测,您稍后会使用参数调用该子例程:

my $func = regexVerify(qr/^([a-z].*)?$/i);
# $func is now a "code reference" or "anonymous subroutine"

...

if ($func->($foo)) {    # invoke the subroutine stored in $func with arg ($foo)
    print "$foo is verified.\n";
} else {
    print "$foo is not verified!\n";
}

答案 1 :(得分:2)

在您调用匿名函数之前,

local $_ = shift;不会执行。即

my $anon_func = regexVerify (qr/^([a-z].*)?$/i);

# NOW sending arguments in @_ for local $_ = shift;
print $anon_func->("some string");