Arrays Perl-如果数组中已经存在元素,则从数组中删除该元素

Arrays Perl-如果数组中已经存在元素,则从数组中删除该元素,arrays,perl,Arrays,Perl,我有一个关于perl嵌入函数的问题。 在您看来,“map”函数可以帮助我弹出一个数组中的所有元素,如果它已经存在于另一个数组中 以下是阵列: 名为旧事件的数组: my @older_events = ( surname => [ qw( red brown simpson donald ) ], date => [

我有一个关于perl嵌入函数的问题。 在您看来,“map”函数可以帮助我弹出一个数组中的所有元素,如果它已经存在于另一个数组中

以下是阵列:

名为旧事件的数组:

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            
        )
    ]
);
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
        )
    ]
);
命名为新元素的数组:

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            
        )
    ]
);
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
        )
    ]
);
在newevents中,最后两个条目是新的,所以我会从@new_events中弹出元素1和2,因为它已经存在于@older_events中

我如何才能用智能解决方案做到这一点

我必须使用第三个数组,或者,我可以从@older_事件中弹出它吗


感谢您的关注

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

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\u 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;

首先,将数组用于键值对。这是没有用的

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\u 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;

在我看来,您必须使用第三个数组,而不使用mapfunction@clarkseth但如果我使用第三个数组,我的脚本的性能将恶化。。不可能在@new_事件中使用pop吗?这看起来很熟悉。几天前我们没有遇到过类似的问题吗?您在这里谈论的是数组和散列。您的数据结构并不相似,并且对于保存您想要传递的信息来说也不是很有用。我认为您的意思是说辛普森的日期是2018/03/09,时间是
03:24:21
。有关数据结构奇怪的原因,请参阅。我认为您必须使用第三个数组,而不使用mapfunction@clarkseth但如果我使用第三个数组,我的脚本的性能将恶化。。不可能在@new_事件中使用pop吗?这看起来很熟悉。几天前我们没有遇到过类似的问题吗?您在这里谈论的是数组和散列。您的数据结构并不相似,并且对于保存您想要传递的信息来说也不是很有用。我认为您的意思是说simpson的日期是2018/03/09,时间是
03:24:21
。有关您的数据结构奇怪的原因,请参阅。那么,如果我不将元素放入数组,而是放入哈希,是否更好?我的数组加载器是push@newer_events,{date=>“$y/$m/$d”,time=>$time,姓氏=>$lasname};#数组装入器根据您的问题,这不是您要做的。如果确实是这样,请跳过我回答的前两个步骤(因为它们将数据从你在问题中发布的结构转换为你在评论中发布的结构)。那么,如果我不将元素放入数组,而是放入散列,是否更好?我的数组加载器是push@newer_events,{date=>“$y/$m/$d”,time=>$time,姓氏=>$lasname};#数组装入器根据您的问题,这不是您要做的。如果确实是这样,请跳过我回答的前两个步骤(因为它们将数据从您在问题中发布的结构转换为您在评论中发布的结构)。