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 の下にあるものはすべてハッシュrefであり、それらの要素にアクセスするには->演算子が必要です。(技術的には、「hash のハッシュ」ではなく「hashref のハッシュ」があります。そのようなことは不可能だからです。)

参照の詳細については、 perlrefドキュメントを参照してください。

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

アップデート

これがあなたのプログラムの修正版です。違いは次のとおりです。

  • の最初の宣言は、スカラー変数 ではなく、%hohハッシュ変数 で行われます。初期化リストを に割り当てると、リストの最後の要素が変数に割り当てられます。この場合は、に対応するハッシュリファレンスです。これは、ほとんどの場合、あなたが望むものではありません。%hoh$hoh$hohip_rating
  • の要素にアクセスしようとすると、`$hoh{$group}->{$spec} のような演算子が$hoh{$group}必要です。->
  • 問題領域は、おそらく の存在をチェックする必要があり$hoh{$group}->{$input}ます。存在しない場合、入力は有効ではありません。これは、メッセージが示唆するものです。

ハッシュとハッシュ参照の違い (配列と配列参照の違いと同様) を理解し、ハッシュと配列が他のハッシュや配列の要素であってはならないことを理解する必要があります。ハッシュrefおよび配列refは、他のデータ構造の要素にすることができます。これは、別のデータ構造に含めることができるのはスカラーのみであるためです。ハッシュと配列はスカラーではありませんが、参照はスカラー (hashref、arrayref、coderef、および scalarref を含む) であり、あらゆる種類の複雑なネストされたデータ構造を作成するために必要です。


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

中括弧{...}と括弧(...)は非常に異なります。1 つ目はスカラー変数に割り当てる匿名ハッシュを定義し、2 つ目はハッシュ変数に割り当てるリストを定義します。この 2 つが混在していて、どちらを意味しているのか明確ではありません。

  • スカラー変数がある場合は、$hohそれを初期化する必要があります

    my $hoh = { ... }
    

    間接演算子を使用して要素にアクセスします

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

    また

    $hoh->{$group}{$spec}
    
  • ハッシュ変数がある場合は、それを初期化する必要があります

    my %hoh = ( ... )
    

    要素に直接アクセスする

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

    また

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