Perl 修改子程序中的散列引用

标签 perl hash subroutine

我无法理解散列引用并在适当的位置更改散列,而不是返回它。我想编写一个子例程,它将从散列返回一个值并修改散列。我在编码时遇到了一些问题。因此,我编写了以下基本代码来了解就地修改哈希。

#!/usr/local/bin/perl
#Check hash and array references
#Author: Sidartha Karna
use warnings;
use strict;
use Data::Dumper;

sub checkHashRef{
   my ($hashRef, $arrVal) = @_;
   my %hashDeref = %{$hashRef};

   $hashDeref{'check'} = 2;           
   push(@{$arrVal}, 3);

   print "There:" ;
   print Dumper $hashRef;      
   print Dumper %hashDeref;           
   print Dumper $arrVal

}


my %hashVal = ('check', 1);
my @arrVal = (1, 2);

checkHashRef(\%hashVal, \@arrVal);

print "here\n";
print Dumper %hashVal;
print Dumper @arrVal;

观察到的输出是:


    There:$VAR1 = {
          'check' => 1
        };
    $VAR1 = 'check';
    $VAR2 = 2;
    $VAR1 = [
          1,
          2,
          3
        ];
    here
    $VAR1 = 'check';
    $VAR2 = 1;
    $VAR1 = 1;
    $VAR2 = 2;
    $VAR3 = 3;


从输出中,我推断出对 hashDeref 的更改不会修改引用中的数据。我的理解正确吗?有没有办法修改哈希变量而不是返回它。

最佳答案

这是制作 %hashVal 的(浅)副本:

my %hashDeref = %{$hashRef};

哈希引用 $hashRef仍然指向%hashVal但是 %hashDeref没有,它只是一个副本。如果要就地修改传递的哈希引用,请使用传递的哈希引用:
sub checkHashRef{
   my ($hashRef, $arrVal) = @_;
   $hashRef->{'check'} = 2;
   #...

这将使您的更改留在 %hashVal .在数组的情况下,你永远不会复制,你只是在原地取消引用它:
push(@{$arrVal}, 3);

并更改为 $arrVal出现在 @arrVal .

关于Perl 修改子程序中的散列引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10135642/

相关文章:

java - 为什么默认的 Object.toString() 返回 hashCode 的十六进制表示?

mysql - 我应该使用哪种哈希算法来检查文件重复性

perl - 我怎样才能抽出未定义的子程序?

perl - 保持打开的套接字连接 Perl

linux - 我想在 linux 上删除多行文本

java - 命令提示符中使用文件路径的文件哈希生成器

perl - 什么是核心 :match (opcode) subroutine in Perl profiling?

file - 用fortran链接多个文件

perl - Perl 中的 'pack' 函数

arrays - 使用范围运算符分配给 3D 数组的切片