2

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

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

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

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

m/$re/ ? $_ : undef;

上面的子被称为:

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

2 回答 2

2

local $_ = shift;在您调用匿名函数之前不会执行。IE

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

# NOW sending arguments in @_ for local $_ = shift;
print $anon_func->("some string"); 
于 2013-06-05T20:45:57.147 回答
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";
}
于 2013-06-05T20:24:55.713 回答