我很难理解一段代码。声明是:
push(@{$errorfile{$var}}, $filepath);
我相信 push 用于将值附加到数组的末尾。但是上面的表达让我很困惑。有一个散列,并且使用了一个 @ 符号(通常与数组名称一起使用)。在代码的开头,“错误文件”声明为:
my %errorfile;
有人可以帮我吗?
%errorfile
是一个哈希。
$errorfile{$var}
是哈希中的(标量)值,对应于 key $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 参考链接中查看更多详细信息。
一些亮点:
$scalar
变量保存一个标量值,它可以是 undef 和整数、浮点数、字符串或引用。@array
变量包含一个数组,它是一个标量值的可索引列表。%hash
变量保存从字符串到标量值的映射。因此,将数组放入散列的唯一方法是将数组引用放入散列中的值。
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);
你需要阅读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 };
而且,现在我可以打印出品牌和所有者:
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
一个哈希,并且该哈希中的每个条目都包含对 s 数组的引用$filepath
。
这可能会进一步澄清它,因为它显示了对数组的引用的基本用法。但是,您确实应该咨询 perlreftut。
my @your_array = ("Hello");
my $ref = \@your_array;
print @{$ref}[0];
$ref 是对@your_array 的引用
@{$scalar_with_reference} 只是访问引用指向的数组的语法。