arrays - 如何在散列的数组中引用 Perl 散列?

标签 arrays perl hash reference perl-data-structures

这是我正在使用的代码片段:

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/

相关文章:

java - for 循环错误

perl - 如何检查 unix 时间早了 1 天

perl - 该变量不 protected

c# - 如何改进短字符串的散列以避免冲突?

mysql - 哈希密码必须经过清理吗?

c - 如何将 scanf 用于 char 数组输入?

php - in_array 与 isset - 性能

hash - 将哈希与二叉搜索树进行比较

java - if 语句检查变量是否在数组中?

perl - 如何写出或读入 Perl 散列的数组?