在这段代码中,shift使用了两次,即使该方法只接受一个参数:
sub regexVerify ($)
{
my $re = shift;
return sub
{
local $_ = shift;
m/$re/ ? $_ : undef;
};
}
如果再次使用shift,这会使本地$ _的值变为什么?我(也许是天真的)假设变成虚无会导致undef。但如果这是真的,这条线没有意义,对吧?:
m/$re/ ? $_ : undef;
上面的子被称为:
regexVerify (qr/^([a-z].*)?$/i);
答案 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");