6

以前の質問で、スライスを使用して Perl ハッシュを初期化する方法を尋ねました。これは次のように行われます。

my %hash = ();
my @fields = ('currency_symbol', 'currency_name');
my @array = ('BRL','Real');
@hash{@fields} = @array;

ここで、より複雑なハッシュを想像してみましょう。初期化方法は次のとおりです。

my %hash = ();
my $iso = 'BR';
$hash->{$iso}->{currency_symbol} = 'BRL';
$hash->{$iso}->{currency_name} = 'Real';
print Dumper($hash);

これにより、次の結果が得られます。

$VAR1 = {
          'BR' => {
                    'currency_symbol' => 'BRL',
                    'currency_name' => 'Real'
                  }
        };

問題は、スプライス メソッドを使用してこの特定のハッシュを初期化する方法です。

4

3 に答える 3

3

perllolドキュメントのSlicesセクションでは、配列スライスについて説明しています。

多次元配列のスライス(行の一部)を取得する場合は、派手な添え字を付ける必要があります。これは、逆参照のためのポインター矢印を介した単一要素の優れた同義語がありますが、スライスにはそのような便利さが存在しないためです。(もちろん、スライス操作を行うためにいつでもループを作成できることを忘れないでください。)

ループを使用して1つの操作を実行する方法は次のとおりです。@AoA前と同じように変数を想定します。

@part = ();
$x = 4;
for ($y = 7; $y < 13; $y++) {
  push @part, $AoA[$x][$y];
}

同じループをスライス操作に置き換えることができます。

@part = @{ $AoA[4] } [ 7..12 ];

ハッシュスライスに外挿すると、次のようになります。

@{ $hash{$iso} }{@fields} = @array;

「添え字」は角かっこではなく中かっこで囲まれているため、ハッシュスライスであることがわかります。

于 2010-08-24T13:10:06.610 に答える
2

まず第一に、あなたのハッシュは宣言され%hashているので、それはちょうど$hash{ $iso }. $hash->{ $iso }が指すハッシュ内のスロットを参照し$hashます%hash

しかし、それができたら、次のことができます。

@{ $hash{ $iso } }{ @fields } = qw<BRL Real>;

しかし、レベルがすぐに複雑になるので、自動活性化の贅沢をやめて、次のことを行う方が良いでしょう:

my $h = $hash{ $iso }{blah}{blah} = {};
@$h{ @field_names } = @field_values;

ハッシュの階層内の再配置可能なポインターにより、簡単なスライスも可能にする匿名アクセスを簡単に記述できます。

于 2010-08-24T13:09:39.997 に答える
1

$hash{$iso}ハッシュ参照になります。単純なスライスの変数名 (シジルなし) を、参照を含むブロックに置き換えます。

@array{@list}

になる

@{ $hash{$iso} }{@list}

http://perlmonks.org/?node=References+quick+referenceを参照してください。

于 2010-08-24T13:17:42.147 に答える