3

如何在一行中初始化和清除多个哈希。

前任:

my %hash1 = ();
my %hash2 = ();
my %hash3 = ();
my %hash4 = ();

my ( %hash1, %hash2, %hash3, %hash4 ) = ?
4

4 回答 4

5

就像做一样简单

my ( %hash1, %hash2, %hash3, %hash4 );

并且它们此时将不包含任何键或值。

相同的技术适用于标量和数组。

对于undef多个哈希,你可以做

undef %$_ for ( \%hash1, \%hash2 );
于 2013-01-31T13:37:30.070 回答
5

看来(从您的评论中)您确实想清空其中已经包含内容的哈希。你可以这样做:

(%hash1,%hash2,%hash3) = ();

完整示例:

use strict;
use warnings;

my %hash1 = ('foo' => 1);
my %hash2 = ('bar' => 1);
my %hash3 = ('baz' => 1);

(%hash1,%hash2,%hash3) = ();

print (%hash1,%hash2,%hash3);

变量声明总是为您提供一个空变量,因此无需将其设置为空。即使在循环中也是如此:

for (0..100)
{
    my $x;
    $x++;
    print $x;
}

1这将一遍又一遍地打印;即使您可能希望$x保留它的价值,它也不会。

解释: Perl 允许像($foo,$bar) = (1,2). 如果右侧的列表较短,则分配任何剩余的元素undef。因此,将空列表分配给变量列表会使它们全部未定义。

设置一堆东西的另一种有用方法是x操作符:

my ($x,$y,$z) = (100)x3;

这会将所有三个变量都设置为 100。不过,它对于散列来说效果不佳,因为每个变量都需要一个分配给它的列表。

于 2013-01-31T13:56:15.943 回答
0

您可以将其初始化为:

我的 %hash1 = %hash2 = %hash3 = %hash4 = ();

于 2013-01-31T13:31:09.800 回答
0

您无需为变量分配任何内容以确保它为空。如果没有分配任何变量,所有变量都是空的。

my %hash;  # hash contains nothing
%hash = () # hash still contains nothing

将空列表分配给散列的唯一一次是如果您想删除以前分配的值。即便如此,只有在无法通过对散列应用正确的范围限制来解决的情况下,这才是有用的事情。

my (%hash1, %hash2);
while (something) {
    # some code
    (%hash1,%hash2) = ();   # delete old values
}

清空哈希。最好写成:

while (something) {
    my (%hash1, %hash2);    # all values are now local to the while loop
    # some code
}
于 2013-01-31T13:48:57.533 回答