0

所以我正在尝试使用 Perl HoH 并将一些值从 HoH 推送到数组中。

这是代码的一部分,可以更好地解释;

my $hoh = (
antenna_included=>{
    "1" => '1 MultiBand Antenna',
    "2" =>'2 Multiband Antennas',
    "3" =>'1 MultiBand Antenna & 2 WiFi Antennas',
    "4" =>'2 Multiband Cellular Antennas & 2 WiFi Antennas',
    "N" =>'No Antennas Included',
    },
ip_rating=>{
    I6 => 'IP 64',
    CD => 'Intrinsically Safe, Class 1 Div 2, IP 64',
    NI => 'No',
    });

foreach $group ( sort keys %hoh ) {
    foreach $spec ( sort keys %{ $hoh{$group} } ) {   
        print "$spec=>$hoh{$group}{$spec}\n";
    }

    print "what part is it: ";
    my $input = <STDIN>;
    chomp $input;

    if ( exists $hoh{$group} ) {
        print "$hoh{$spec}\n";                #this is the problematic line.  
    }
    else {
    print "not a match!\n";
    }
}

基本上这个脚本的目标是遍历 HoH,但是在它给出的每个散列块中STDIN,然后你输入 ,key然后我想value将该元素的 推入一个数组中。(现在代码只是print用于调试)。

我努力了

$hoh{$group}{$spec}
$hoh{$group}
$hoh{$group}->{$spec}

对于$hoh{$group}我得到HASH(0x6ff920)的所有其他值,它只是空白,没有错误。

有什么想法吗?谢谢

4

2 回答 2

2

使用->运算符。

HoH 下面的所有内容都是一个 hash ref,访问其中的元素需要->操作符。(从技术上讲,你有一个“hashref 的散列”而不是“散列的散列”,因为这样的事情是不可能的。)

有关参考的详细信息,请参阅perlref文档。

$hoh{$group}->{$spec}

更新

这是您的程序的修改版本。区别在于:

  • 的初始声明%hoh是使用散列变量 完成的%hoh,而不是标量变量$hoh。将初始化列表分配给$hoh将导致列表的最后一个元素被分配给变量,在这种情况下,hashref 对应于ip_rating。这几乎肯定不是你想要的。
  • 试图访问一个元素$hoh{$group}需要->操作符,比如`$hoh{$group}->{$spec}。
  • 问题区域可能需要检查是否存在$hoh{$group}->{$input}. 如果它不存在,则输入无效,这就是消息所暗示的。

您只需要了解哈希和哈希引用之间的区别(类似于数组和数组引用之间的区别)并意识到哈希和数组不能是其他哈希或数组的元素。哈希引用和数组引用可以是其他数据结构的元素,因为只有标量可以包含在另一个数据结构中。哈希和数组不是标量,但引用是标量(包括 hashref、arrayrefs、coderefs 甚至 scalarrefs),并且是创建任何类型的复杂嵌套数据结构所必需的。


my %hoh = (
    antenna_included=>{
        "1" => '1 MultiBand Antenna',
        "2" =>'2 Multiband Antennas',
        "3" =>'1 MultiBand Antenna & 2 WiFi Antennas',
        "4" =>'2 Multiband Cellular Antennas & 2 WiFi Antennas',
        "N" =>'No Antennas Included',
    },
    ip_rating=>{
        I6 => 'IP 64',
        CD => 'Intrinsically Safe, Class 1 Div 2, IP 64',
        NI => 'No',
    });

foreach $group ( sort keys %hoh ) {
    foreach $spec ( sort keys %{ $hoh{$group} } ) {   
        print "$spec=>$hoh{$group}->{$spec}\n";
    }

    print "what part is it: ";
    my $input = <STDIN>;
    chomp $input;

    if ( exists $hoh{$group}->{$input} ) {
        print $hoh{$group}->{$input}."\n";
    }
    else {
        print "not a match!\n";
    }
}
于 2014-12-31T19:26:32.533 回答
1

大括号{...}和括号(...)是非常不同的。第一个定义了一个匿名散列,您将其分配给一个标量变量,而第二个定义一个列表,您将其分配给一个散列变量。您将两者混合在一起,尚不清楚您的意思。

  • 如果你有一个标量变量$hoh,那么你需要初始化它

    my $hoh = { ... }
    

    并使用间接运算符访问元素

    $hoh->{$group}->{$spec}
    

    或者

    $hoh->{$group}{$spec}
    
  • 如果你有一个哈希变量,那么你需要用

    my %hoh = ( ... )
    

    并直接访问元素

    $hoh{$group}->{$spec}
    

    或者

    $hoh{$group}{$spec}
    
于 2014-12-31T19:47:22.603 回答