【发布时间】:2019-03-21 03:58:32
【问题描述】:
我有一个任意的数据结构。这种形式通常是相似的,因为它由大约四级深的数组和散列组成,大约有两到六个我想更改的值。一个典型的例子:
$VAR1 = [
undef,
[
{
'0' => 'some string'
}
],
undef,
[
undef,
{
'1033' => 'another string '
}
]
];
虽然我知道语法足以访问这两个值并在此特定示例(或任何其他示例)中更改它们,但从一种用法到下一种用法,这将以硬编码表达式失败的方式发生变化。
这个感觉应该是一个简单的递归运行的sub,但是一旦发现数据结构的元素是数组或者hash,不知道怎么把元素通过引用传递到下一个递归调用中以便可以以非临时方式对其进行修改。以下代码递归失败(尽管如果它不递归,它可以更改顶级数组中的浅值并且此更改会持续):
sub deep_nested_replace {
my ($d, $string) = @_;
if (ref($d) eq 'ARRAY') {
for (my $i=0; $i<scalar @$d; $i++) {
deep_nested_replace($d->[$i], $string);
}
}
elsif (ref($d) eq 'HASH') {
foreach my $k (keys %$d) {
deep_nested_replace($d->{$k}, $string);
}
}
elsif (defined $d) {
$d = $string;
}
}
我该如何进行这项工作?如果这是错误的方法,那么正确的方法是什么?
【问题讨论】:
-
在函数的第一行中分配给
$d,您正在复制该值。如果您直接分配给@_中的相应元素,它应该会影响调用者数据。 -
谢谢@Sam。如果您想写一个快速的答案,很乐意选择它。
标签: perl