如何检查键是否存在于哈希数组中并具有特定值 - Perl



我有哈希数组:

my %hash = (
'DISK'    => 1,
'MEMORY'  => 1,
'CPU'     => 0,
'SSL'     => 1,
'PROCESS' => 1,
);

功能:

sub fun
{
my $self = shift;
my @ret = ();
my $index = 0;
my ($alarm, $hash) = @_;
my $key = "CPU";
print "Key: $_ and Value: $hash->{$_}n" foreach (keys %{$hash});
foreach my $name (keys %{$self->{ServerParameters}})
{
my $par = uc $name;
$par =~ s/d$//g;
if (!defined ${${$self->{ServerParameters}}{$name}}{$alarm})
{
next;
}
if (${${$self->{ServerParameters}}{$name}}{$alarm} eq "1")
{       
if (exists $hash{$par}){
if ($hash{$par} == 0){
print "VALUE 0n";
}
}
my $param = ${$self->{ServerParameters}}{$name}->getValues();
$ret[$index++] = "Alarm parameter: $par : $param";
}
}
return @ret;
}

我正在将哈希数组传递给上面的函数:

fun("Red", %hash);

首先,我尝试检查特定键是否存在,然后检查它的值是否为 0。当尝试运行上面的代码时,我收到:

全局符号"%hash"需要显式包名称

我如何使用例如 grep 进行类似的检查?感谢您的任何协助。

当你这样做时:

fun("Red", %hash);

您发送的是哈希引用,而不是哈希。有两种方法可以解决此问题。

一个,最简单的,发送哈希。我建议使用下面的第二种方法,除非您有很多代码/许多子例程需要更新。

fun("Red", %hash);

。然后更改:

my ($alarm, $hash) = @_;

自:

my ($alarm, %hash) = @_;

这将减轻任何其他代码更改。

其次,您不必根据上面的示例更改调用和参数的分配,而是必须将代码中哈希的所有用法更改为哈希引用。例如:

if (exists $hash->{$par}){
if ($hash->{$par} == 0){
print "VALUE 0n";
}
}

没有真正的正确或错误的方法,这实际上取决于您如何处理子例程中的代码。

发送哈希会生成副本(即,您现在有两个浮动的哈希实例,这可能会有问题,具体取决于哈希的大小。在这种情况下,至少可以说可以忽略不计)。更改 sub 中哈希中的数据不会更改外部范围的哈希。

发送引用不会创建减少内存占用的副本,但对 sub 内部哈希引用的任何更改都将更改 sub 外部的原始哈希。

最新更新