0

以下は、配列のハッシュ(配列に割り当てられたキー)を作成するコード(ハッシュで遊んでいるだけ)です。しかし、配列参照として出力を取得します。この配列参照が表示されるのはなぜですか?

 #!/usr/bin/perl
 my @result = (0,0,0);
 my @operator = ('AP', 'MP', 'UP');
 my %operator_res;

 for ( $i = 0; $i <= $#operator; $i++ ) {
     if ( $i == 2 ) {
         @result = (4,5,6);
     } elsif ( $i == 1 ) {
         @result = (1,2,3);
     }
     @{$operator_res{$operator[$i]}} = @result;
 }
 foreach $keys (%operator_res) {
     print "$keys:";
     #print "@{$operator_res{$keys}}\n";
     print "$operator_res{$keys}[0], $operator_res{$keys}[1], $operator_res{$keys}[2]\n";
 }

出力は

UP:4, 5, 6
ARRAY(0x17212e70):, ,   Why is this array reference printing?
AP:0, 0, 0
ARRAY(0x17212e00):, ,
MP:1, 2, 3
ARRAY(0x17212e20):, ,
4

4 に答える 4

4
foreach $keys (%operator_res)

する必要があります

foreach $keys (keys %operator_res)
于 2013-03-04T13:04:25.113 に答える
1

ループは、キーだけでなく、foreachの各要素を繰り返し処理し%operator_resます。ikagimがすでに回答しているようkeysに、ハッシュのキーのみを取得するために使用する必要があります。

出力を確認するとData::Dumper、次のようになります。%operator_res

$VAR1 = 'UP';
$VAR2 = [
          4,
          5,
          6
        ];
$VAR3 = 'AP';
$VAR4 = [
          0,
          0,
          0
        ];
$VAR5 = 'MP';
$VAR6 = [
          1,
          2,
          3
        ];

ご覧のとおり、要素ごとに常に2つの反復が取得されます。1つはキー用で、もう1つは配列参照用です。

于 2013-03-04T13:11:16.333 に答える
0

Perl のハッシュ値はスカラーでなければなりません。多次元ハッシュをシミュレートするには、ハッシュまたは配列への参照である値を使用します。

この線

@{$operator_res{$operator[$i]}} = @result;

あなたの質問では

$operator_res{ $operator[$i] } = [ @result ];

つまり、その$operator[$i]時点でキーに関連付けられている値は、内容が と同じ新しい配列への参照@resultです。

多くの例については、perllol のドキュメントを参照してください。

于 2013-03-04T13:04:14.337 に答える
0

Data::Dumper を使用して、適切にフォーマットされた方法でデータを出力できます。

use Data::Dumper;
print Dumper(\%operator_res);

Q: なぜこの配列参照印刷なのですか?

A: 次の行のため: print "$keys:";

于 2013-03-04T13:05:03.823 に答える