首页 > 解决方案 > Perl - 从引用的@array 中删除重复项

问题描述

如果我有一个具有以下结构(日期、时间、用户)的 perl 数组,按用户排序:

open my $fh, '<', $file;
while( <$fh> ) {
  my @lines = split /\n/;
  my ($user, $y, $m, $d, $time) = $lines[0] =~ /\A(\w);(\d+)\/(\d+)\/(\d+);(\d+:\d+:\d+.\d+)/;   # Encapsulate values
  push @evts, { user => $user, date => "$y/$m/$d", time => $time};  # Array loader
} # This was missing.
close($fh);
my @by_usr = sort { $a->{user} cmp $b->{user} } @evts;

如果它的时间完全相同,我怎么能从中删除重复的条目?

$VAR1 = {
          'time' => '08:08:36.120',
          'date' => '2018/08/06',
          'user' => 'USER1'
        };
$VAR2 = {
          'time' => '08:08:36.120',
          'date' => '2018/08/06',
          'user' => 'USER1'
        };
...(and more)

我尝试了独特的功能,但它不起作用:

sub uniq {
    my %seen;
    grep !$seen{$_}++, @_;
}
my @unique_events = uniq (@by_usr);

我可以进行任何澄清。

标签: perlsortingduplicates

解决方案


您只检查哈希引用(字符串化时)是否唯一。要检查独特的时间,就这样做吧。

grep !$seen{$_->{'time'}}++, @_;

simbabque 的答案检查是否有任何值不同,而不仅仅是时间(假设所有哈希都具有相同的键并且没有值包含___)。


推荐阅读