目标:从数组中删除特定值
我写了一个脚本,它运行良好,但我对我编写它的方式不满意。所以我很想知道有没有更好的方法来写它。请考虑以下用例:
我有一个嵌套的哈希/哈希/数组...如下所示。我需要删除local
名称中包含的任何数组值:
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my $hash = { esx1 =>
{ cluster => "clu1",
fd => "fd1",
ds => [
'ds1',
'ds2',
'localds',
],
},
esx2 =>
{ cluster => "clu2",
fd => "fd2",
ds => [
'ds3',
'ds4',
'dslocal',
],
},
};
foreach my $a ( keys %$hash )
{
foreach ( 0..$#{ $hash->{$a}->{ds} } )
{
delete $hash->{$a}->{ds}->[$_] if $hash->{$a}->{ds}->[$_] =~ /local/i;
@{ $hash->{$a}->{ds} } = grep defined, @{ $hash->{$a}->{ds} };
}
}
print Dumper ($hash);
所以脚本会删除“ localds
”和“ dslocal
”并保持其他所有内容不变。
问题:
- 有没有更简洁的方法来编写
foreach ( 0..$#{$hash->{$a}->{ds} } )
循环 - 如果我不写
grep
上面的行,则结果数组的值包含local
已删除但被替换为undef
. 为什么会这样。
谢谢。