Вы получаете другое значение в pushdata
, потому что вы печатаете что-то другое. print \$example;
печатает ссылку на скаляр $example
, а не ссылку на массив, который он содержит. Чтобы напечатать ссылку на массив, как вы делали внутри pushdata
, вы должны были использовать print $example;
.
(при печати ссылки на скаляр используется REF
, если скаляр содержит ссылку, GLOB
, если он содержит глобус, и SCALAR
в противном случае.)
Хотя вы этого не спрашивали, причина, по которой ваш код не работает, заключается в том, что вы добавляете в @pusharray
, а немассив, на который ссылаются $example
и $ref
. @pusharray = @$ref;
копирует содержимое массива.
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
sub pushdata{
my ($ref, $value) = @_;
print("\$ref: $ref\n");
push(@$ref, $value*2); # Adds to @$ref aka @$example
my @local = @$ref;
print("\\\@local: ", \@local, "\n");
push(@local, $value*3); # Adds to @local.
}
my $example = [ 1, 1, 1, 1 ];
print("\$example: $example\n");
print("\\\@\$example: ", \@$example, "\n");
pushdata($example, 10) for 1..4;
print(Dumper($example));
Вывод:
$example: ARRAY(0x1ea5e0)
\@$example: ARRAY(0x1ea5e0)
$ref: ARRAY(0x1ea5e0)
\@local: ARRAY(0x6d0470)
$ref: ARRAY(0x1ea5e0)
\@local: ARRAY(0x6d0470)
$ref: ARRAY(0x1ea5e0)
\@local: ARRAY(0x6d0470)
$ref: ARRAY(0x1ea5e0)
\@local: ARRAY(0x6d0470)
$VAR1 = [
1,
1,
1,
1,
20,
20,
20,
20
];