【问题标题】:Pass by reference array inside hash in perl在perl中通过哈希内的引用数组传递
【发布时间】:2015-12-23 22:40:47
【问题描述】:

我想修改一个位于 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'] 的引用吗?

【问题讨论】:

  • “如果数组不在散列中,它工作正常” 不,它没有。您的子例程只是修改传递的数组的本地副本。无论它来自哪里,它都不会改变外部数组
  • @Borodin 是的,我的错。我已将局部变量与子例程外部的名称相同,因此看起来函数正在更改它。
  • 您必须始终 use strict 和 use warnings 在您编写的每个 Perl 程序的顶部,并用my 声明每个变量.这将保护您免受最简单的错误的影响,并且会在此处显示错误

标签: arrays perl hash pass-by-reference


【解决方案1】:

在您的 changeArray 子程序中,您正在从哈希中包含的 arrayref 创建一个数组 @array, 所以所有更改都将针对@array,当 changeArray 完成时,它会超出范围。

试试

sub changeArray {
   my $arrayref = $_[0];
   $arrayref->[0] = "not foo";
}

【讨论】:

  • -> 叫什么?
  • -> 是 中缀取消引用运算符。您可以在 perlop 手册页上找到文档。
  • 当然,超出范围的部分在这里并不完全准确,请参阅上面的 cmets,这是假设 sub changeArray { my @array = @{$_[0]}; ... }。这似乎是正常的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多