在我的脚本中理解指向哈希的 Perl 指针
Posted
技术标签:
【中文标题】在我的脚本中理解指向哈希的 Perl 指针【英文标题】:Understanding Perl pointers to hashes in my script 【发布时间】:2017-04-14 02:48:43 【问题描述】:所以我知道拆分是如何工作的,我的问题是指针 $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;
【问题讨论】:
如果此代码在循环中(while()
、for()
等),那么是的,每次迭代都有不同的值。更具体地说,您将其声明为在else
内部词汇化的标量值作为简单标量,然后立即将其转换为散列引用,您为其设置三个键,每个键都有一个值。所以在循环之后,如果你遍历$die_loc$pattern
数组引用,每个元素都会有一个哈希引用,有自己的site
、x
和y
键,有自己的值
什么迭代?我在您发布的代码中看到的只是一个 else
分支本身。
是的,这是在 while 循环中读取文件。谢谢!
【参考方案1】:
我认为这一切都在一个循环中,每次都分配$_
。
你每次声明my $p
,所以一旦分配到每个内存位置,每个人都会获得自己的内存位置。那时,它被 autovivified 变成一个哈希引用,因为它是这样分配的。该引用被复制到数组中,因此您将拥有它们。您可以使用核心模块Scalar::Util 中的refaddr
获取引用的内存地址。或者,就此而言,只需打印 $p
。
你所拥有的可以写成
my $p = site => $site, x => $x, y => $y ;
push @$die_loc$pattern, $p;
所以说到底,哈希 %die_loc
将在键 $pattern
下有一个数组引用,其中包含带有键 site
、x
和 y
的哈希引用的元素。
use feature 'say';
foreach my $hr (@$die_loc$pattern)
say "site: $hr->site, x: $hr->x, y: $hr->y"
这将为您处理的每个(假定的)迭代打印一行。但通常您不想键入键名而是使用keys
来打印哈希,例如
foreach my $hr (@$die_loc$pattern)
say join ', ', map "$_: $hr->$_" sort keys %$hr;
其中的键也被排序以获得一致的打印。或者使用一个模块,比如Data::Dump
。
请注意,引用与指针略有不同。
只贴了一个代码片段,所以我还要说你想总是以
开头use warnings 'all';
use strict;
【讨论】:
【参考方案2】:这样写的代码要好得多
else
my ( $site, $x, $y ) = split /,/;
my %p = (
site => $site,
x => $x,
y => $y,
);
push @ $die_loc$pattern , \%p;
或者,也许更好
else
my %p;
@pqw/ site x y / = split /,/;
push @ $die_loc$pattern , \%p;
【讨论】:
以上是关于在我的脚本中理解指向哈希的 Perl 指针的主要内容,如果未能解决你的问题,请参考以下文章