简体   繁体   English

Perl:如何通过引用传递数组元素

[英]Perl: How to pass array element by reference to sub

I'm coming to Perl from a C/C++ background and am progressing very slowly, so please bear with me... 我是从C / C ++背景来到Perl并且进展非常缓慢,所以请耐心等待...

I've got an array of hashes and I want to pass one element of the array to a sub-routine (by reference) where that element will be modified. 我有一个哈希数组,我想将数组的一个元素传递给子例程(通过引用),其中该元素将被修改。

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;
}

Well that was fun. 那很有趣。

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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM