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'
                  }
        };

现在的问题是:如何使用 splice 方法初始化这个特定的哈希?

4

3 回答 3

3

perllol 文档的切片部分涵盖了数组切片:

如果你想得到一个多维数组中的一个切片(一行的一部分),你将不得不做一些花哨的下标。这是因为虽然我们通过指针箭头为单个元素提供了一个很好的同义词来解引用,但切片不存在这样的便利。(当然,请记住,您总是可以编写一个循环来执行切片操作。)

这是使用循环执行一项操作的方法。我们将@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 回答