如何用for ...每个循环重置多个Perl哈希?

时间:2013-04-16 09:33:42

标签: perl

我需要在mod_perl脚本中重置一些全局哈希变量。

这有效 - 如所述在这里:https://stackoverflow.com/a/4090870

$_ = '' for ($a, $b, $c);
$_ = 0 for ($d, $e, $f);

这似乎不起作用:

$_ = () for (%a, %b, %c);

为什么它不适用于哈希?可以吗?数组怎么样?

(我通常会尝试范围变量,所以上面的内容不是必需的,但在这种情况下,我担心它必须是这样的。另外,我可能会错过一些基本的理解,如何...循环在Perl工作,请赐教。)

2 个答案:

答案 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
  ...
}