【问题标题】:Perl: How to pass array element by reference to subPerl:如何通过引用子传递数组元素
【发布时间】:2017-04-03 14:41:51
【问题描述】:

我是从 C/C++ 背景来到 Perl 的,进展非常缓慢,所以请多多包涵...

我有一个哈希数组,我想将数组中的一个元素传递给一个子例程(通过引用),在该子例程中该元素将被修改。

use strict;
use warnings;

use Data::Dumper;

my @array;
my %hash;

$hash{'key1'} = 1;
$hash{'key2'} = 2;
$hash{'key3'} = 3;
$hash{'key4'} = 4;
push @array, {%hash};

$hash{'key1'} = 10;
$hash{'key2'} = 20;
$hash{'key3'} = 30;
$hash{'key4'} = 40;
push @array, {%hash};

# Expect:
#   @array[0] like 1,2,3,4
#   @array[1] like 10,20,30,40
print Dumper(@array); 

doChange(\@array[1]); # <<==== THIS IS THE BIT WHERE I NEED ASSISTANCE TO PASS ARRAY ELEMENT BY REFERENCE, IF POSSIBLE

# Expect:
#   @array[0] like 1,2,3,4
#   @array[1] like 100,200,300,400 <<== VALUES HAVE CHANGED
print Dumper(@array);      

sub doChange
{
    my %h = @_; # <<===  THIS IS NOT RIGHT EITHER!?

    $h{'key1'} = 100;
    $h{'key2'} = 200;
    $h{'key3'} = 300;
    $h{'key4'} = 400;
}

【问题讨论】:

  • 正在将对哈希的引用推送到他的数组中。 { %hash }\%hash 之间的唯一区别是前者获取 %hash 的副本并返回对该副本的引用,而后者返回对原始哈希的引用。
  • @DaveCross 哼,确实非常正确,我忽略了这一点,谢谢指出。

标签: arrays perl hash


【解决方案1】:

这很有趣。

use strict;
use warnings;

use Data::Dumper;

my @array;
my $hash;

$hash = {}; # initialise to a blank hash.
$hash->{'key1'} = 1;
$hash->{'key2'} = 2;
$hash->{'key3'} = 3;
$hash->{'key4'} = 4;
push @array, $hash;

$hash = {};  # initialise to a blank hash.
$hash->{'key1'} = 10;
$hash->{'key2'} = 20;
$hash->{'key3'} = 30;
$hash->{'key4'} = 40;
push @array, $hash;

# Expect:
#   @array[0] like 1,2,3,4
#   @array[1] like 10,20,30,40
print Dumper(\@array);   # Dumper takes a reference.

doChange($array[1]); # pass a pointer (reference) to the hash.

# Expect:
#   @array[0] like 1,2,3,4
#   @array[1] like 100,200,300,400 <<== VALUES HAVE CHANGED
print Dumper(\@array);

sub doChange
{
    my $h = shift; # Get the pointer to your hash.

    $h->{'key1'} = 100;  # mess with it.
    $h->{'key2'} = 200;
    $h->{'key3'} = 300;
    $h->{'key4'} = 400;
}

【讨论】:

  • 谢谢。 [我在之前的评论中表示感谢,但似乎没有发布??]
  • 不用担心。 Perl 引用就像 C 指针,但没有内存泄漏!
猜你喜欢
  • 2016-04-09
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
相关资源
最近更新 更多