更新:在一行中初始化和清除多个哈希

时间:2013-01-31 13:28:50

标签: perl

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

例如:

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

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

4 个答案:

答案 0 :(得分:5)

就像做

一样简单
my ( %hash1, %hash2, %hash3, %hash4 );

并且它们不会包含任何键或值。

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

undef多个哈希值,您可以

undef %$_ for ( \%hash1, \%hash2 );

答案 1 :(得分: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.但是,对于哈希值,它不能很好地工作,因为每个变量都需要一个分配给它的列表。

答案 2 :(得分:0)

您可以将其初始化为:

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

答案 3 :(得分: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
}