Arrays perl中哈希内的按引用传递数组
我想在perl中修改位于散列中的数组。然而,我似乎不能在这里通过引用。如果数组不在散列中,则可以正常工作。这是我的密码:Arrays perl中哈希内的按引用传递数组,arrays,perl,hash,pass-by-reference,Arrays,Perl,Hash,Pass By Reference,我想在perl中修改位于散列中的数组。然而,我似乎不能在这里通过引用。如果数组不在散列中,则可以正常工作。这是我的密码: %hash = ( array1 => ['foo', 2, 'bar'] ); print @{$hash{array1}}, "\n"; changeArray($hash{array1}); print @{$hash{array1}}, "\n"; sub changeArray { @array = @{$_[0]}; $arra
%hash = (
array1 => ['foo', 2, 'bar']
);
print @{$hash{array1}}, "\n";
changeArray($hash{array1});
print @{$hash{array1}}, "\n";
sub changeArray
{
@array = @{$_[0]};
$array[0] = "not foo";
}
输出:
$ ./scrap.pl
foo2bar
foo2bar
$hash{array1}
不是对匿名数组['foo',2,'bar'的引用吗 在changeArray子文件中,您正在从散列中包含的arrayref生成一个数组@array
,
所以所有的更改都是针对@array的,当changeArray完成时,它将超出范围
试一试
->
被称为什么?->
是中缀解引用操作符。您可以在手册页上找到文档。当然,超出范围的部分在这里并不完全准确,请参见上面的注释,这是假设subchangearray{my@array=@{$[0]};..}
。这似乎是正常的做法,“如果数组不在散列中,它工作正常”不,它不在。您的子例程只是修改所传递数组的本地副本。它不会改变外部阵列,无论它来自何处from@Borodin是的,我错了。我调用了与子例程外部同名的局部变量,因此它看起来像是函数在更改它。您必须始终在编写的每个Perl程序的顶部使用strict和warnings,并使用my声明每个变量。这将保护您免受最简单的错误的影响,并在此处揭示错误
sub changeArray {
my $arrayref = $_[0];
$arrayref->[0] = "not foo";
}