3

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

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

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

my %errorfile;

有人可以帮我吗?

4

4 回答 4

8

%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变量保存从字符串到标量值的映射。

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

于 2013-09-10T19:28:11.113 回答
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); 
于 2013-09-10T19:33:56.063 回答
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 };

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

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

于 2013-09-10T20:17:00.023 回答
0

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

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

$ref 是对@your_array 的引用

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

于 2013-09-10T19:34:30.533 回答