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

sik*_*ver 2 perl hash pointers reference 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;
}
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 5

我认为这是一个循环,$_每次都分配.

您每次都声明, my $p因此每次分配到它们时都会获得自己的内存位置.此时,它被自动生成为哈希引用,因为它是如何分配的.该引用被复制到数组中,因此您将拥有它们.您可以使用refaddr核心模块Scalar :: Util获取引用的内存地址.或者,就此而言,只需打印$p.

你有什么可以写成

my $p = { site => $site, x => $x, y => $y };

push @{$die_loc{$pattern}}}, $p;
Run Code Online (Sandbox Code Playgroud)

所以,毕竟是说,做,哈希%die_loc将在关键$pattern有一个数组引用,这对元素与键的散列引用site,xy.

use feature 'say';

foreach my $hr (@{$die_loc{$pattern}}) {
    say "site: $hr->{site}, x: $hr->{x}, y: $hr->{y}"
}
Run Code Online (Sandbox Code Playgroud)

这将为您处理的每个(假定的)迭代打印一行.大多数情况下,您不想键入键名,而是打印哈希值,例如 keys.如果有帮助,也可以对键进行排序Data::Dump.

请注意,引用与指针略有不同.

只发布了一个代码片段,所以我也建议一直开始

foreach my $hr (@{$die_loc{$pattern}}) {
    say join ', ', map { "$_: $hr->{$_}" } sort keys %$hr;
}
Run Code Online (Sandbox Code Playgroud)