Arrays Perl:如何通过引用将数组元素传递给sub

Arrays Perl:如何通过引用将数组元素传递给sub,arrays,perl,hash,Arrays,Perl,Hash,我是从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};

我是从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{'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};
#期望:
#@array[0]类似于1,2,3,4
#@array[1]像10,20,30,40
打印转储程序(@array);
doChange(\@array[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;
}
使用严格;
使用警告;
使用数据::转储程序;
我的@数组;
我的$hash;
$hash={};#初始化为空哈希。
$hash->{'key1'}=1;
$hash->{'key2'}=2;
$hash->{'key3'}=3;
$hash->{'key4'}=4;
push@array,$hash;
$hash={};#初始化为空哈希。
$hash->{'key1'}=10;
$hash->{'key2'}=20;
$hash->{'key3'}=30;
$hash->{'key4'}=40;
push@array,$hash;
#期望:
#@array[0]类似于1,2,3,4
#@array[1]像10,20,30,40
打印转储程序(\@数组);\转储程序获取一个引用。
doChange($array[1]);#传递一个指向散列的指针(引用)。
#期望:
#@array[0]类似于1,2,3,4
#@array[1]类似100200300400{'key2'}=200;
$h->{'key3'}=300;
$h->{'key4'}=400;
}
那很有趣

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;
}
使用严格;
使用警告;
使用数据::转储程序;
我的@数组;
我的$hash;
$hash={};#初始化为空哈希。
$hash->{'key1'}=1;
$hash->{'key2'}=2;
$hash->{'key3'}=3;
$hash->{'key4'}=4;
push@array,$hash;
$hash={};#初始化为空哈希。
$hash->{'key1'}=10;
$hash->{'key2'}=20;
$hash->{'key3'}=30;
$hash->{'key4'}=40;
push@array,$hash;
#期望:
#@array[0]类似于1,2,3,4
#@array[1]像10,20,30,40
打印转储程序(\@数组);\转储程序获取一个引用。
doChange($array[1]);#传递一个指向散列的指针(引用)。
#期望:
#@array[0]类似于1,2,3,4
#@array[1]类似100200300400{'key2'}=200;
$h->{'key3'}=300;
$h->{'key4'}=400;
}

他正在将对哈希的引用推送到数组中。
{%hash}
\%hash
之间唯一的区别是前者获取
%hash
的副本并返回对该副本的引用,而后者返回对原始哈希的引用。@DaveCross-hum,的确如此,我忽略了这一点,谢谢你指出。他正在把对散列的引用推到他的数组中。
{%hash}
\%hash
之间唯一的区别是前者获取
%hash
的副本并返回对该副本的引用,而后者返回对原始哈希的引用。@DaveCross-hum,的确如此,我忽略了这一点,谢谢你指出。谢谢。[我在之前的评论中说了谢谢,但它似乎没有发布???]不用担心。Perl引用就像C指针,但没有内存泄漏!谢谢[我在之前的评论中说了谢谢,但它似乎没有发布???]不用担心。Perl引用就像C指针,但没有内存泄漏!