Perl 如何替换深度嵌套但任意的数据结构中的值?

Perl 如何替换深度嵌套但任意的数据结构中的值?,perl,Perl,我有一个任意的数据结构。这种形式通常是相似的,它由数组和散列组成,深度约为四级,我想更改大约两到六个值。一个典型的例子是: $VAR1 = [ undef, [ { '0' => 'some string' } ], undef, [ undef, {

我有一个任意的数据结构。这种形式通常是相似的,它由数组和散列组成,深度约为四级,我想更改大约两到六个值。一个典型的例子是:

$VAR1 = [
          undef,
          [
            {
              '0' => 'some string'
            }
          ],
          undef,
          [
            undef,
            {
              '1033' => 'another string '
            }
          ]
        ];
虽然我非常了解语法,可以访问这两个值并在这个特定示例(或任何其他示例)中更改它们,但从一个使用到下一个使用,这种更改的方式会导致硬编码表达式失败

这感觉它应该是一个递归运行的简单sub,但是一旦它发现数据结构的元素是数组或散列,我不知道如何通过引用将该元素传递到下一个递归调用中,以便以非临时的方式修改它。以下代码递归失败(尽管如果它不递归,它可以更改顶级数组中的浅值,并且此更改仍然有效):

次深\u嵌套\u替换{
我的($d,$string)=@;
if(参考($d)等式“数组”){
对于(my$i=0;$i[$i],$string);
}
}
elsif(参考($d)等式“散列”){
foreach my$k(钥匙%$d){
深嵌套替换($d->{$k},$string);
}
}
elsif(定义为$d){
$d=$string;
}
}

我该怎么做?如果这是错误的方法,那么正确的方法是什么?

带有函数参数的
@
数组包含传递给函数的标量(或其他显式引用)的别名。对它的修改将影响调用者数据。与
grep
map
中的
$\ucode>相同。这是来自其他编程语言的东西,您有时需要小心

但是,通过从一个标量变量赋值到另一个标量变量,就像惯用的
my($d,$string)=@
一样,标量值从一个变量复制到另一个变量

如果要影响传递给调用方函数的标量值,可以直接使用
@
数组及其元素

sub deep_nested_replace {
    my ($d, $string) = @_;

    if (ref($d) eq 'ARRAY') {
        deep_nested_replace($_, $string) for @$d;
    }
    elsif (ref($d) eq 'HASH') {
        deep_nested_replace($_, $string) for values %$d;
    }
    elsif (defined $d) {
        $_[0] = $string;
    }
}

通过在函数的第一行中分配给
$d
,您正在制作该值的副本。如果您在
@
中直接分配给相应的元素,它应该会影响呼叫者数据。谢谢@Sam。如果您要写一个快速答案,将很乐意选择它。添加了对答案进行必要更改(和一些简化)的代码。希望你不介意。我当然不介意:)
sub deep_nested_replace {
    my ($d, $string) = @_;

    if (ref($d) eq 'ARRAY') {
        deep_nested_replace($_, $string) for @$d;
    }
    elsif (ref($d) eq 'HASH') {
        deep_nested_replace($_, $string) for values %$d;
    }
    elsif (defined $d) {
        $_[0] = $string;
    }
}