gpt4 book ai didi

arrays - 如何删除引用数组的元素?

转载 作者:行者123 更新时间:2023-12-04 17:04:58 26 4
gpt4 key购买 nike

我想用一个子程序从几个大数组中删除元素。我使用引用来避免复制到 sub 中。

@a=qw(ok now what is hi the matter);

sub zonk {
$array=shift; # this is a reference of an array
foreach $i (0..$#$array) { # I saw some say to avoid last element to get size
#if (@$array[$i] =~ /hi/) { delete @$array[$i]; }
#if ($array->[$i] =~ /hi/) { delete $array->[$i]; }
#if ($array->[$i] =~ /hi/) { delete @$array->[$i]; }
if ($array->[$i] =~ /hi/) { print "FOUND "; }
print $array->[$i],"\n";
}
@$array = grep{$_} @$array; # removes empty elements
}
zonk(\@a);
print join(':',@a);

如果我按原样运行上面的程序,我会得到:
ok
now
what
is
FOUND hi
the
matter
ok:now:what:is:hi:the:matter

但是,如果我改用任何注释行,我会得到:

delete 参数不是 hi.pl 第 10 行的 HASH 元素或切片。

我最初尝试了 splice,但后来索引发生了变化并混淆了迭代。
很高兴知道这篇文章中提到的所有方法,但是最有效的是我正在寻找的 :)

附录:这在我的 linux 机器(ubuntu 9.10,perl 5.10)上完美运行(我的意思是每个注释行),但上述错误发生在我使用 perl 5.005_03 的 Windows 7 机器上。
升级不是一种选择。

谢谢

最佳答案

为什么不从一开始就使用 grep?

@array = grep { !/hi/ } @array;
# Or, for *referenced* array
@$arrayRef = grep { !/hi/ } @$arrayRef;

用于澄清评论中出现的问题的一小部分注释:
  • 此方法(或任何使用 grep 的方法,包括原始海报代码)通过新生成的数组的大小增加脚本的内存使用量。

    例如。如果脚本(没有第一个数组)占用了 10MB 内存,原始数组占用了 15MB 内存,结果数组占用了 14MB 内存,那么你的程序的总内存占用 会增加从 25MB 到 39MB 而 grep在跑。
  • 曾经grep完成后,原始数组使用的内存将可用于垃圾收集(有一些与本文无关的警告)。
  • 然而——这很重要——即使原始 15MB 的数据被垃圾收集, Perl 不会将 15MB 返回给操作系统 - 例如脚本的内存占用 将保持 39MB 即使在垃圾收集之后也不会降到 24MB。
  • 好的一面是,在程序的剩余生命周期中,释放出来的 15MB 可用于内存分配(不考虑内存碎片问题)——因此,如果您的脚本需要额外分配 1MB、5MB 或 15MB 的内存,它的内存占用不会超过 39MB 的高点。如果它需要 17MB 的额外内存,那么由此产生的内存占用将只有 41MB,而不是 56MB。
  • 如果这个内存算法不让你满意(例如,如果你的原始数组是 500MB 并且你不愿意容忍程序内存占用增加到 1GB),那么 Dallaylaen's answer下面是一个很好的算法来完成任务 没有额外的内存分配
  • 关于arrays - 如何删除引用数组的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4415287/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com