在我的脚本中理解指向哈希的 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数组引用,每个元素都会有一个哈希引用,有自己的sitexy键,有自己的值 什么迭代?我在您发布的代码中看到的只是一个 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 下有一个数组引用,其中包含带有键 sitexy 的哈希引用的元素。

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 指针的主要内容,如果未能解决你的问题,请参考以下文章

如何真正看到链接到一个文件的不同 perl 脚本的内容?

如何在我的 Perl 脚本中包含来自另一个文件的函数?

在网页上运行 perl 脚本后保存文件

在 Perl 中按顺序打印哈希键

perl逐级输出哈希key和value

删除指针数组而不删除内存中的指向对象?