3

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

这有效 - 如此处所述:https ://stackoverflow.com/a/4090870

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

这似乎不起作用:

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

为什么它不适用于哈希?可以做到吗?数组呢?

(我通常会尝试对变量进行作用域,所以上述内容不是必需的,但在这种情况下,恐怕它必须是这样的。另外,我可能对 for...each 循环如何工作有一些基本的了解Perl,请赐教。)

4

2 回答 2

4

你可以通过参考来做到这一点:

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

但这并不能回答您关于为什么没有参考就无法工作的问题:

将散列放入您的for (%h)-statement 时,散列会在list context 中隐式评估。

(编辑:我最初说的是标量上下文,后来意识到它是列表上下文并改编了答案)

于 2013-04-16T09:37:41.090 回答
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
  ...
}
于 2013-04-16T21:41:59.680 回答