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

Aus*_*ore 2 arrays perl

我有两个数组,@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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我遇到这个错误:

在script.pl第67行第2行的字符串eq中使用未初始化的值.

字符串都在数组中定义.所以我猜这是由于我在循环中删除数组中的元素而引起的,但我认为向后循环数组会阻止这样的问题发生.

那我在循环中哪里出错了?此外,我一直在努力解决这个循环,这暗示我的整个思考过程出了问题.有没有更好的方法来做到这一点?

eph*_*ent 10

没有理由在这里明确循环.你想过滤名字:那是一个grep.您想检查成员身份:也可以通过a来完成grep.

@names = grep {my $name = $$_[0]; not grep $_ eq $name, @employees} @names;
Run Code Online (Sandbox Code Playgroud)

内阵列的重复扫描不是特别有效; 可以通过提前预先填充集合(实际上是哈希)来避免它.

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