我有一个任意的数据结构。形式通常是相似的,因为它由大约四个级别的数组和哈希组成,我想更改大约两个到六个值。一个典型的例子:
$VAR1 = [
undef,
[
{
'0' => 'some string'
}
],
undef,
[
undef,
{
'1033' => 'another string '
}
]
];
尽管我对语法非常了解,可以在特定示例(或任何其他示例)中访问这两个值并进行更改,但是从一种用法到另一种用法,这将以硬编码表达式失败的方式发生变化。
感觉它应该是一个递归运行的简单子,但是一旦发现数据结构的元素是数组或哈希,我不知道如何通过引用将元素传递到下一个递归调用中,这样可以以非临时方式进行修改。以下代码递归失败(尽管如果不递归,则可以更改顶级数组中的浅值,并且此更改会生效):
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;
}
}
我该如何工作?如果这是错误的方法,那么正确的方法是什么?
@_
具有函数参数的数组包含传递给函数的标量(或其他显式引用)的别名。对其进行修改将影响呼叫者数据。与$_
ingrep
或in相同map
。这是您有时需要注意的其他编程语言所带来的影响。
但是,如习惯用法那样,通过将一个标量变量分配给另一个变量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;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句