Perl-从数组中删除元素(如果已存在于另一个数组中)

时间:2018-07-17 13:23:04

标签: arrays perl

我对perl嵌入式函数有疑问。 您认为,“地图”功能可以帮助我弹出数组中的所有元素(如果已经存在于另一个数组中)吗?

这些是数组:

名为OLDER_EVENTS的数组:

my @older_events = (
    surname => [
        qw(
            red
            brown
            simpson
            donald         
        )
    ],
    date => [
        qw(
            2018/02/14
            2018/03/09
            2018/05/01
            2018/08/02
        )
    ],
    time => [
        qw(
            01:00:52
            01:06:41
            03:24:31
            19:14:31            
        )
    ]
);

ARRAY命名了新元素:

my @new_events = (
    surname => [
        qw(
            simpson
            donald         
            blanco
            ernald
        )
    ],
    date => [
        qw(
            2018/03/09
            2018/08/02
            2018/08/01
            2018/08/14
        )
    ],
    time => [
        qw(
            03:24:31
            19:14:31            
            00:03:16
            09:21:45
        )
    ]
);

在新事件中,最后两个条目是新的,因此,我将从@new_events中弹出元素1和2,因为它已经存在于@older_events中

如何使用智能解决方案呢?

我可以使用第三个数组吗?还是可以从@older_events中弹出它?

感谢您的关注

1 个答案:

答案 0 :(得分:7)

首先,您将数组用于键值对。这没用。

my %older_events = @older_events;
my %newer_events = @newer_events;

第二,您想对记录执行操作,但是您的数据没有组织成记录。

my @older_events =
   map {
      +{
         surname => $older_events->{ surname }[$_],
         date    => $older_events->{ date    }[$_],
         time    => $older_events->{ time    }[$_],
      }
   }
      0..$#{ $older_events->{surname} };

my @newer_events =
   map {
      +{
         surname => $newer_events->{ surname }[$_],
         date    => $newer_events->{ date    }[$_],
         time    => $newer_events->{ time    }[$_],
      }
   }
      0..$#{ $newer_events->{surname} };

第三,我们需要一种快速的方法来查找事件是否在@older_events中。

sub key { join "\0", @{ $_[0] }{qw( surname date time )} }

my %older_event_by_key =
   map { key($_) => $_ }
      @older_events;

最后,我们可以grep

@newer_events =
   grep { !$old_event_by_key{ key($_) } }
      @newer_events;