0

次のようなコードがあります。

@VAR1 = {
      'ID' => '1',
      'Name' => '"ABC"'
    },
    {
      'ID' => '2',
      'Name' => '"EFG"'
    };

私はこれを以下のように使用しています:

my @Var2 = ({
              'A' => "B",
              'C' => "D",
              'E' => \@Var1
              },
              {
              'A1' => "B1",
              'C1' => "D1",
              'E' => \@Var1
              });

したがって、AVar2 で Dumper を実行すると、次のようになります。

$VAR1 = {
      'A' => 'B',
      'C' => 'D',
      'E' => [
                  {
                    'ID' => '1',
                    'Name' => '"ABC"'
                  },
                  {
                    'ID' => '2',
                    'Name' => '"EFG"'
                  };
             ]
    };


$VAR2 = { 'A' => 'B',
      'C' => 'D',
      'E' => $VAR1->{'E'}
    };

これが2番目のケースで印刷されないのはなぜですか.最初に印刷されますか?

4

2 に答える 2

1

やってるように見える

print(Dumper(@Var2));

適切な使用法が

local $Data::Dumper::Purity = 1;
print(Dumper(\@Var2));

これは出力します

$VAR1 = [
          {
            'A' => 'B',
            'C' => 'D',
            'E' => [
                     {
                       'ID' => '1',
                       'Name' => '"ABC"'
                     },
                     {
                       'ID' => '2',
                       'Name' => '"EFG"'
                     }
                   ]
          },
          {
            'A1' => 'B1',
            'E' => [],
            'C1' => 'D1'
          }
        ];
$VAR1->[1]{'E'} = $VAR1->[0]{'E'};

上記は、データ構造を正確に再構築します。期待しているようです

$VAR1 = [
          {
            'A' => 'B',
            'C' => 'D',
            'E' => [
                     {
                       'ID' => '1',
                       'Name' => '"ABC"'
                     },
                     {
                       'ID' => '2',
                       'Name' => '"EFG"'
                     }
                   ]
          },
          {
            'A1' => 'B1',
            'E' => [
                     {
                       'ID' => '1',
                       'Name' => '"ABC"'
                     },
                     {
                       'ID' => '2',
                       'Name' => '"EFG"'
                     }
                   ],
            'C1' => 'D1'
          }
        ];

しかし、それはあなたが持っているものと同等ではありません。あなたの本来の構造で、

  • $Var2[0]{E}両方とも$Var2[1]{E}同じ配列への参照です
  • $Var2[0]{E}[0]両方とも$Var2[1]{E}[0]同じハッシュへの参照です
  • $Var2[0]{E}[1]両方とも$Var2[1]{E}[1]同じハッシュへの参照です

期待される出力では、

  • $Var2[0]{E}および$Var2[1]{E}異なる配列への参照です
  • $Var2[0]{E}[0]および$Var2[1]{E}[0]異なるハッシュへの参照です
  • $Var2[0]{E}[1]および$Var2[1]{E}[1]異なるハッシュへの参照です

を使用して必要な出力を取得できます

local $Data::Dumper::Deepcopy = 1;

ただし、そうすると、ダンプされたデータ構造は実際のデータ構造とは異なります。

于 2013-03-21T22:49:21.773 に答える
1

http://perldoc.perl.org/Data/Dumper.html

Data::Dumper は、値のダンプ中に遭遇したすべての参照をカタログ化します。相互参照 (perl 構文の部分構造の名前の形式で) は、元の値セットの構造的な相互依存性を維持しながら、すべての可能なポイントに挿入されます。構造のトラバーサルは深さ優先で、最初に指定された値から最後まで順番に進みます。

それを無効にすることができます:

$Data::Dumper::Deepcopy または $OBJ->Deepcopy([NEWVAL]) ブール値に設定して、構造体のディープ コピーを有効にすることができます。相互参照は、絶対に必要な場合 (つまり、参照サイクルを壊すため) にのみ行われます。デフォルトは 0 です。

于 2013-03-21T22:38:36.703 に答える