这是我正在使用的代码片段:
my %photo_details = (
'black_cat' => (
('size' => '1600x1200', 'position' => -25),
('size' => '1280x1024', 'position' => 25),
('size' => '800x600', 'position' => 0),
),
'race_car' => (
('size' => '1600x1200', 'position' => 10),
('size' => '800x600', 'position' => 5),
),
);
my $photo = 'black_cat';
foreach my $photo_detail ($photo_details{$photo})
{
my $size = $photo_detail{'size'};
my $position = $photo_detail{'position'};
print ("size = $size, position = $position\n");
}
我期望得到的是:
size = 1600x1200, position = -25
size = 1280x1024, position = 25
size = 800x600, position = 0
我得到的是:
Use of uninitialized value $size in concatenation (.) or string at C:\Test.pl line 23.
Use of uninitialized value $position in concatenation (.) or string at C:\Test.pl line 23.
size = , position =
foreach 语句显然是错误的,因为不仅没有 $size 和 $position 的值,而且它只经历了一次循环而不是三次。我已经尝试了各种变量前缀的变体,但都没有找到。
我究竟做错了什么?
最佳答案
这是一些更新的代码,下面有解释:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %photo_details = (
'black_cat' => [
{'size' => '1600x1200', 'position' => -25},
{'size' => '1280x1024', 'position' => 25},
{'size' => '800x600', 'position' => 0},
],
'race_car' => [
{'size' => '1600x1200', 'position' => 10},
{'size' => '800x600', 'position' => 5},
],
);
print Dumper( %photo_details );
foreach my $name ( keys %photo_details ) {
foreach my $photo_detail ( @{ $photo_details{$name} } ) {
my $size = $photo_detail->{'size'};
my $position = $photo_detail->{'position'};
print Dumper( $photo_details{$photo} );
print ("size = $size, position = $position\n");
}
}
我已经用方括号和大括号替换了你的一些括号。在 Perl 中,方括号表示对匿名数组的引用,而大括号表示对匿名哈希的引用。这些被称为匿名是因为匿名数组或散列没有明确的变量名。
由于 Perl 数据结构让您存储对哈希的引用而不是实际的哈希,因此您需要这些来构造引用。您可以通过以下两个步骤执行此操作:
my @array = ( 1, 2, 3 );
my $array_ref = \@array;
my %hash = ( 'one' => 1, 'two' => 2, 'three' => 3 );
my $hash_ref = \%hash_ref;
要从 $array_ref 和 $hash_ref 中获取数据,您需要 -> 运算符:
print $array_ref->[0], "\n";
print $hash_ref->{one}, "\n";
引用哈希键时,您不需要在 {} 中使用引号,尽管有些人认为哈希键上的引号是一种很好的做法。
我添加了一个对整个数据结构进行迭代的示例作为示例,而不仅仅是查看一个引用。这是第一行:
foreach my $name ( keys %photo_details ) {
keys 方法返回哈希中的所有键,以便您可以按顺序获取它们。下一行遍历 %photo_details 中的所有 photo_detail hashrefs:
foreach my $photo_detail ( @{ $photo_details{$photo} } ) {
@{ $photo_details{$photo} }
取消引用引用 $photo_details{$photo}
放入一个数组,您可以使用 foreach 对其进行迭代。我添加的最后一件事是调用 Data::Dumper ,一个非常有用的模块,随 Perl 一起发布,可以为您打印出数据结构。这在构建这样的数据结构时非常方便,它的近亲 Data::Dumper::Simple 也是如此。 .不幸的是,这个模块没有随 Perl 一起发布,但我更喜欢它的输出,因为它包含变量名。
有关如何使用引用构建复杂数据结构的进一步阅读,请查看 perlreftut .
关于arrays - 如何在散列的数组中引用 Perl 散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1993796/