gpt4 book ai didi

arrays - 比较两个数组,删除匹配的项目

转载 作者:行者123 更新时间:2023-12-02 06:20:32 24 4
gpt4 key购买 nike

我有两个数组,@names@employees,其中填充了代表姓名的字符串。 @names 是二维的,包含对匿名数组的引用,但我们关心的数据位置在 @names[i][0]。我想遍历 @names 并找出哪些名字不在 @employees 中。

起初我认为通过 @names 向后循环,将其与 @employees 进行比较并删除 @names 中的任何匹配项会起作用,但我遇到了一些错误。这是我拥有的:

for my $i (reverse(0 .. $#names)) {
foreach my $employee (@employees) {
if ($names[$i][0] eq $employee) { # line 67
splice(@names, $i, 1);
}
}
}

我遇到了这个错误:

Use of uninitialized value in string eq at script.pl line 67, line 2.

字符串都定义在数组中。所以我猜测这是由于我在遍历数组时删除了数组中的元素造成的,但我认为向后遍历数组可以防止发生这样的问题。

那么我的循环哪里出错了?此外,我一直在为这个循环而苦苦挣扎,这向我暗示我的整个思维过程出了问题。有更好的方法吗?

最佳答案

没有理由在这里显式循环。你想过滤名字:那是一个grep。您想要检查成员资格:这也可以通过 grep 来完成。

@names = grep {my $name = $$_[0]; not grep $_ eq $name, @employees} @names;

内部数组的重复扫描不是特别有效;可以通过提前预填充一个集合(实际上是一个哈希)来避免这种情况。

my %employees = map +($_ => 1), @employees;
@names = grep !$employees{$$_[0]}, @names;

关于arrays - 比较两个数组,删除匹配的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11021693/

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