使用散列和数组的组合的Perl表达式

时间:2013-09-10 19:25:13

标签: perl reference

我很难理解一段代码。声明是:

push(@{$errorfile{$var}}, $filepath);

我相信push用于将值附加到数组的末尾。但上面的表达让我很困惑。有一个哈希值,并且使用了@符号(通常与数组名称一起使用)。在代码的开头,“errorfile”声明为:

my %errorfile;

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:8)

%errorfile是哈希。

$errorfile{$var}是散列中的(标量)值,对应于键$var。该值恰好是数组引用。

@{$errorfile{$var}}是引用引用的数组。

示例初始化:my %errorfile = (foo => [12, 34], bar => [56]);$var = "bar"; $filepath = "my/file.txt"; push(@{$errorfile{$var}}, $filepath); %errorfile成为(foo => [12, 34], bar => [56, "my/file.txt"])之后。

请参阅David W发布的Perl References链接中的详细信息。

一些亮点:

  • $scalar变量包含标量值,可以是undef,整数,浮点数,字符串或引用。
  • @array变量包含一个数组,这是一个可转换的标量值列表。
  • %hash变量包含从字符串到标量值的映射。

因此,将数组放入散列的唯一方法是将数组引用放入散列中的值。

答案 1 :(得分:2)

my %errorfile;  # Declares a hash named errorfile

$errorfile{$var} # is reference to an array 
# This is probably used to store different flavors of error files.

@{$errorfile{$var}} # is the array which is referenced.  

# Let's call it @array = @{$errorfile{$var}}

push(@{$errorfile{$var}}, $filepath); # is similar to push(@array, $filepath); 

答案 2 :(得分:2)

您需要阅读Perl References

标准Perl数据类型谈论单个数据。标量包含单个数据。哈希和数组包含大量单个数据。但是,如果你有一些更复杂的东西会发生什么。

想象一下汽车注册数据库。汽车有型号,年份,品牌,车主等。我如何拥有包含所有这些数据的汽车数组

参考文献可以帮助您解决此限制。例如,我可能有一个包含此信息的汽车的哈希值:

my %car;
$car{make} = "Yugo";
$car{year} = "1987";
$car{model} = "GV";
$car{owner} = "David";
$car{value} = "$0.02";

我可以通过在它前面放一个反斜杠来引用这个汽车哈希

my $car_hash_reference = \%car;

我的引用只是存储此汽车哈希的内存中的一个点。现在,我可以将汽车哈希引用推送到一系列汽车中:

push @cars, $car_hash_reference;

我的@cars数组中的每个条目都是对特定汽车的哈希的引用。每辆车都有它的主人,型号,品牌,年份等。当我弹出我的车入口时,我得到了这个参考:

my $car = pop @cars;   # Reference to a car

我可以取消引用我的引用,将%哈希符号放回到它前面:

my %car_hash = %{ $car };

而且,现在我可以打印出make和所有者:

print "The owner of the $car_hash{make} is $car_hash{owner}\n";

换句话说,@cars中的每个条目现在都包含有关此特定汽车的所有信息,而不是仅存储单个数据的@cars数组的每个条目。

让我们来看看你遇到麻烦的代码行。我添加了一些空格,使其更容易理解:

push ( @{ $errorfile{$var} }, $filepath );

$errorfile{$var}是对数组的引用。我可以告诉你,因为@{ $errorFile{$var} }将它解引回一个数组。一旦取消引用,您就可以 $filepath推送到它上面,就像常规数组一样。

看起来%errorfile是一个哈希,该哈希中的每个条目都包含对$filepath s数组的引用。

答案 3 :(得分:0)

这可能会进一步澄清它,因为它显示了对数组的引用的基本用法。但是,你真的应该咨询perlreftut。

my @your_array = ("Hello"); 
my $ref = \@your_array; 
print @{$ref}[0]; 

$ ref是对@your_array的引用

@ {$ scalar_with_reference}只是您访问引用指向的数组的语法。