我需要在mod_perl脚本中重置一些全局哈希变量。
这有效 - 如所述在这里:https://stackoverflow.com/a/4090870
$_ = '' for ($a, $b, $c);
$_ = 0 for ($d, $e, $f);
这似乎不起作用:
$_ = () for (%a, %b, %c);
为什么它不适用于哈希?可以吗?数组怎么样?
(我通常会尝试范围变量,所以上面的内容不是必需的,但在这种情况下,我担心它必须是这样的。另外,我可能会错过一些基本的理解,如何...循环在Perl工作,请赐教。)
答案 0 :(得分:4)
你可以用引用来做到这一点:
%$_ = () for (\%a, \%b, \%c);
但是这并没有回答你的问题,为什么没有引用它不起作用:
将散列放入for (%h)
语句时,散列将在列表上下文中隐式计算。
(编辑:我最初说的是标量上下文,后来实现了列表上下文并调整了答案)
答案 1 :(得分:3)
你做的工作比你要多。没有必要循环变量。
$_ = '' for ($a, $b, $c);
$_ = 0 for ($d, $e, $f);
($a,$b,$c) = ('') x 3; # ... = ('','','')
($d,$e,$f) = (0) x 3; # ... = (0,0,0)
当然,如果您想将它们设置为undef
($a,$b,$c) = (); # set them to undef
循环变量的唯一原因是你是在代表其他范围的子例程中进行的。
sub fill{
my $fill = shift;
$_ = $fill for @_;
return;
}
{
fill( 0, my($d,$e,$f) ); # my($d,$e,$f) = (0) x 3;
}
同样,不是通过散列引用列表:
%$_ = () for \(%a, %b, %c);
# or
%$_ = () for (\%a, \%b, \%c);
只需将它们设置为空列表即可。
(%a,%b,%c) = ();
如果正确设置变量的范围,您应该很少需要这样做。
my(%a,%b,%c); # <== wrong
sub exmpl{
(%a,%b,%c) = (); # <==
# do something with them
...
}
sub exmpl{
my (%a,%b,%c); # <== correct
# do something with them
...
}