在perl中使用未初始化的哈希值

时间:2011-03-16 23:37:18

标签: perl

我在perl中定义了3个GLOBAL哈希

my %a = (); 
my %b = ();
my %c = ();

现在出现以下代码: -

if(checkSomeCondition) {  
    %c = %a;  
}  
else {  
    %c = %b;  
}
do some operations on %c

但问题是,因为%a和%b仍未初始化,%c将取未定义的值%a和%b。所以我现在在%c上进行的操作不会切换到有效的%a或%b 即假设我将%c分配给%a,稍后我再次回到if条件并立即分配给%b,再次返回分配%a,此时%a没有有效值来显示有效的操作已完成先前。

如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

如果我理解你的问题,你要找的是参考:

my (%a, %b, $c);  # $c is a scalar to hold the hash reference

if (condition) {
    $c = \%a;   # the `\` operator takes a reference to the variable
} else {
    $c = \%b;
}

# do stuff with %$c

假设condition为真:

$$c{new_key} = 'value';  # or `$c->{new_key} = 'value';`

print "$_: $a{$_}\n" for keys %a;  # prints "new_key: value"

您可以在perlref手册页中了解有关Perl参考的更多信息。

最后,我希望您使用的变量名称仅用于此示例。更长的变量名称有助于记录您的代码。

答案 1 :(得分:1)

哈希没有“初始化”或“未初始化”状态。它们要么是空的,要么有内容。

目前还不清楚你遇到了什么问题;您希望%c的更改在%a或%b中生效,具体取决于您的条件吗?如果是这样,您应该使用哈希引用。

答案 2 :(得分:0)

预期会有这种行为。

执行操作时:%c =%a,哈希%c被%a的内容覆盖,基本上从%a复制到%c。 因此,如果%a为空/未定义,则在上述操作之后将不确定%c(即使%c在操作之前有一些内容,它现在也将为空)。

如'runrig'所述,您应该在复制哈希值之前添加一些额外的检查。

如果您可以提供有关您想要达到的目标的更多详细信息,也许可以提供帮助。