1

私はこのようなことをしたいと思っています。このようにプログラミングすると、値が消えるという問題があったことを覚えています。このタイプの構造はハッシュに対して「正しい/有効」ですか?

my %VAR;
$VAR{SCALAR} = "test scalar";
$VAR{ARRAY}[0] = "test array";
$VAR{HASH}{NAME}[0] = "test hash array 1";
$VAR{HASH}{NAME}[1] = "test hash array 2";
$VAR{HASH}{NAME}[2]{SOMEHASH} = "test hash array hash 1";
$VAR{HASH}{NAME}[2]{ANOTHERHASH} = "test hash array hash 2";
4

3 に答える 3

6

これがうまくいかない理由はわかりません。どのような問題が発生していますか?

データ構造が期待どおりであることを確認したい場合は、次のようなものをお勧めしますData::Dumper

 # set up your %VAR hash as you like
 use Data::Dumper;
 print Dumper(\%VAR);

次のようなものを取得する必要があります:

$VAR1 = {
      'HASH' => {
                  'NAME' => [
                              'test hash array 1',
                              'test hash array 2',
                              {
                                'ANOTHERHASH' => 'test hash array hash 2',
                                'SOMEHASH' => 'test hash array hash 1'
                              }
                            ]
                },
      'ARRAY' => [
                   'test array'
                 ],
      'SCALAR' => 'test scalar'
    };
于 2010-10-12T18:56:47.850 に答える
1

これは正確にはあなたの質問ではありませんが...実際にその方法でデータ構造を構築している場合は、よりクリーンな「リテラル」構文を検討するかもしれません。

#!/usr/bin/perl
use strict;
use warnings;

my %VAR = (
  SCALAR => 'test scalar',
  ARRAY => [
    'test array',
  ],
  HASH => {
    NAME => [
      'test hash array 1',
      'test hash array 2',
      {
        SOMEHASH => 'test hash array hash 1',
        ANOTHERHASH => 'test hash array hash 2',
      },
    ],
  },
);

主な2つの理由は、読みやすさと自動生存のバグです。これは間違ったperlではありませんが、誤って次のように入力するなど、デバッグが難しい問題が発生する可能性があります。

$VAR{HASH}{NAME}[1] = "test hash array 1";
$VAR{HASH}{NAME}[2] = "test hash array 2";
$VAR{HASH}{NAME}[2] = "test hash array 3";
$VAR{HASH}{NAME}[4] = "test hash array 4";

それ以外の

$VAR{HASH}{NAME}[1] = "test hash array 1";
$VAR{HASH}{NAME}[2] = "test hash array 2";
$VAR{HASH}{NAME}[3] = "test hash array 3";
$VAR{HASH}{NAME}[4] = "test hash array 4";

あなたが使用している場合、これは問題になることはありません

$VAR{HASH}{NAME} = [
  undef,
  'test hash array 1',
  'test hash array 2',
  'test hash array 3',
  'test hash array 4',
];
于 2010-10-13T19:28:55.090 に答える
0

多くの場合、人々が値の消失について不平を言うとき、それは彼らがそれらを置き換えたためです。ハッシュの任意の部分に割り当てるときは、参照値であったとしても、以前にあった値を置き換えます。

use 5.010;

use Data::Dumper;

my %hash;

$hash{key} = { qw(a 1 b 2) };
say Dumper( \%hash );

$hash{key} = 5;
say Dumper( \%hash );

出力は、2番目のレベルであったハッシュ参照がもう存在しないことを示しています。

$VAR1 = {
          'key' => {
                     'a' => '1',
                     'b' => '2'
                   }
        };

$VAR1 = {
          'key' => 5
        };

他の変数の場合と同じように、何をどこに割り当てるかについて注意する必要があります。

于 2010-10-14T21:15:32.727 に答える