嗨,我想知道是否有人可以帮助我理解我的脚本中的这个Perl指向哈希的指针

时间:2016-11-29 22:46:38

标签: perl pointers hashtable

所以我知道分割是如何工作的,我的问题是指针$ 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;
}

2 个答案:

答案 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;
}