Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays perl中哈希内的按引用传递数组_Arrays_Perl_Hash_Pass By Reference - Fatal编程技术网

Arrays 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

我想在perl中修改位于散列中的数组。然而,我似乎不能在这里通过引用。如果数组不在散列中,则可以正常工作。这是我的密码:

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