我在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没有有效值来显示有效的操作已完成先前。
如何解决这个问题?
答案 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'所述,您应该在复制哈希值之前添加一些额外的检查。
如果您可以提供有关您想要达到的目标的更多详细信息,也许可以提供帮助。