所以我知道分割是如何工作的,我的问题是指针$ p是如何工作的。它是否为每次迭代都有不同的值,并将值作为数组推送到哈希值?当我需要提取它们时,它是如何将这些值保持在一起的?我有超过100行的值我需要引用回来,如果$ p没有随每次迭代而改变,我不知道如何做到这一点。谢谢!
else{
my($site,$x,$y) = split /,/, $_;
my $p;
$p->{site} = $site;
$p->{x} = $x;
$p->{y} = $y;
push @{$die_loc{$pattern}}, $p;
}
答案 0 :(得分:5)
我认为这是一个循环,每次都会分配$_
。
每次声明 my $p
,因此每次分配后都会获得自己的内存位置。此时它被 autovivified 成为哈希引用,因为它是如何分配的。该引用被复制到数组中,因此您将拥有它们。您可以使用核心模块Scalar::Util中的refaddr
获取引用的内存地址。或者,就此而言,只需打印$p
。
你所拥有的东西可以写成
my $p = { site => $site, x => $x, y => $y };
push @{$die_loc{$pattern}}}, $p;
所以说完了之后,密钥%die_loc
下的哈希$pattern
会有一个数组引用,它为元素提供了带有键site
,{{1}的哈希引用}和x
。
y
这会为您处理的每个(假定的)迭代打印一行。大多数情况下,您不希望键入键名,而是打印哈希值,例如use feature 'say';
foreach my $hr (@{$die_loc{$pattern}}) {
say "site: $hr->{site}, x: $hr->{x}, y: $hr->{y}"
}
。如果有帮助,也可以对密钥进行排序say "$_ => $hash{$_}" for keys %hash;
。
请注意,引用与指针略有不同。
只发布了代码片段,所以我也建议始终以
开头... for sort keys %hash;
答案 1 :(得分:1)
这段代码写的更好
else {
my ( $site, $x, $y ) = split /,/;
my %p = (
site => $site,
x => $x,
y => $y,
);
push @{ $die_loc{$pattern} }, \%p;
}
或者,或许还可以更好
else {
my %p;
@p{qw/ site x y /} = split /,/;
push @{ $die_loc{$pattern} }, \%p;
}