我很难理解一段代码。声明是:
push(@{$errorfile{$var}}, $filepath);
我相信push用于将值附加到数组的末尾。但上面的表达让我很困惑。有一个哈希值,并且使用了@符号(通常与数组名称一起使用)。在代码的开头,“errorfile”声明为:
my %errorfile;
有人可以帮助我吗?
答案 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}只是您访问引用指向的数组的语法。