1

次のコードでは、配列の内容が出力されると、hashref2 の key3 に目的の値がありません (達成したいのは、hashref1 が key3 に value1 の配列を持ち、hashref2 が key3 に value2 の配列を持つことです)。

コード フローでは、最初に hashref を設定してから、データをサブ配列にプッシュする必要があります。

サブ配列への参照の使用がここに行く正しい方法であるかどうか、アドバイスをお願いできますか?

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @array;
my @subarray;


# Puash to array
my $hashref1 = {
  key1 => 'value1_1',
  key2 => 'value1_2',
  key3 => \@subarray
};
push (@array, $hashref1);

# push some data in subarray
push (@subarray, 'value1');

# clear subarray
splice(@subarray);

# Puash to array
my $hashref2 = {
  key1 => 'value2_1',
  key2 => 'value2_2',
  key3 => \@subarray
};
push (@array, $hashref2);

# push some data in subarray
push (@subarray, 'value2');

print  "hashref1:\n".Dumper($hashref1);
print  "hashref2:\n".Dumper($hashref2);

print  "array:\n".Dumper(@array);

アウト:

hashref1:
$VAR1 = {
          'key2' => 'value1_2',
          'key1' => 'value1_1',
          'key3' => [
                      'value2'
                    ]
        };
hashref2:
$VAR1 = {
          'key2' => 'value2_2',
          'key1' => 'value2_1',
          'key3' => [
                      'value2'
                    ]
        };
array:
$VAR1 = {
          'key2' => 'value1_2',
          'key1' => 'value1_1',
          'key3' => [
                      'value2'
                    ]
        };
$VAR2 = {
          'key2' => 'value2_2',
          'key1' => 'value2_1',
          'key3' => $VAR1->{'key3'}
        };
4

2 に答える 2

4

すべてのハッシュ参照に同じ配列への参照を格納しています。これは、を変更する@subarrayと、それを参照するすべてのハッシュが一斉に変更されるように見えることを意味します。

代わりに、次のように個別の浅いコピーを作成します

@subarray = ('value2');
my $hashref2 = {
  key1 => 'value2_1',
  key2 => 'value2_2',
  key3 =>  [ @subarray ],
};
push (@array, $hashref2);
于 2013-03-08T16:56:20.783 に答える