从对哈希的引用中获取值

时间:2016-07-27 22:58:27

标签: perl hash

我知道已有多篇关于此主题的帖子,但我没有发现它们对我的特定情况有帮助。

当我运行这段代码

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在记忆中的位置,这不是我以为我要求的。

2 个答案:

答案 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';
}