我知道已有多篇关于此主题的帖子,但我没有发现它们对我的特定情况有帮助。
当我运行这段代码
时my $bandName = '';
my $rrh_sth = $dbh->prepare("SELECT serial....");
$rrh_sth->execute;
my $int_hash = $rrh_sth->fetchall_hashref('serial');
delete $_->{serial} for values %$int_hash;
foreach my $s ( keys %$int_hash ) {
if ( $values[6] eq $s ) {
#$bandName = @{%$int_hash}{$s};
$bandName = $int_hash ->{$s};
my $ulink = getFreq($bandName, "u");
my $dlink = getFreq($bandName, "d");
my $status = "active";
print Dumper (
$bandName,
$values[0],
$values[8],
$values[7],
$values[6],
$values[11],
$values[10],
$values[3],
$values[4],
$values[5],
$dlink,
$ulink
);
}
}
我一直在获取特定序列的密钥和值,由$s
表示。我知道我必须取消引用int_hash
,但我不确定现在我尝试的方法是如何工作的。
$VAR1 = {
'rrhName' => 'MCD59'
};
$VAR2 = 'MCO57';
$VAR3 = 'R-S-S:1-0-1';
$VAR4 = 'scb';
$VAR5 = '12NT46000050';
$VAR6 = undef;
$VAR7 = '109786038';
$VAR8 = 'MCO: 976 2x5W AC';
$VAR9 = 'enabled';
$VAR10 = '1';
$VAR11 = ''; #EDITED
$VAR12 = ''; #EDITED
一般来说,当我有一个引用时,我需要取消引用它才能进入切片,但是在$VAR1
的情况下,当我进入我的数据库看到插入的值时,它告诉我$VAR1
在记忆中的位置,这不是我以为我要求的。
答案 0 :(得分:3)
您的$int_hash
是一个哈希引用,您可以将其正确地取消引用到哈希%$int_hash
中,然后检索其密钥。然后,也可以正确使用获得的密钥来获得相应的值$int_hash->{$s}
。
但是,正如Dumper
输出所示,与键$s
关联的值本身就是一个哈希引用。由于引用本身是一个标量,我们总是可以将它作为一个值赋给一个键,这就是构建复杂(嵌套)数据结构的方式。有关教程,请参阅perldsc
,有关参考文章,请参阅perlreftut
获取教程,perlref
参考。
简而言之,您只需要继续解除引用
$int_hash->{$s}->{'rrhName'}; # or,
$int_hash->{$s}{'rrhName'}; # or even
$int_hash->{$s}{rrhName};
第二行和第三行是语法快捷方式,在上面的页面中进行了解释。
其中任何一个都将返回嵌套哈希值MCD59
。
答案 1 :(得分:1)
您承诺对匹配%$int_hash
的哈希$values[6]
中的密钥进行线性搜索。你不能以这种方式访问数组。它看起来像这样
my $values_6;
for my $i ( 0 .. $#values ) {
if ( $i == 6 ) {
$values_6 = $values[$i];
}
}
您需要放弃for
循环并直接访问哈希元素。将其与访问二级哈希值相结合,您的代码应如下所示
my $band_name;
if ( my $band = $int_hash->{$values[6]} ) {
$band_name = $band->{rrhName};
my $ulink = getFreq($band_name, 'u');
my $dlink = getFreq($band_name, 'd');
my $status = 'active';
}