Perl - 从引用的@array 中删除重复项

标签 perl sorting duplicates

如果我有一个具有以下结构(日期、时间、用户)的 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)

我试过 unique 函数,但它不起作用:

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

我可以提供任何说明。

最佳答案

您只是检查散列引用(当字符串化时)是否唯一。要检查唯一时间,就这样做吧。

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

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

关于Perl - 从引用的@array 中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52334691/

相关文章:

perl - 如何在脚本中指定只使用特定版本的 perl?

linux - 简单的 Perl 程序将时间以纳米分辨率打印到屏幕上

python - django-我如何为查询创建排序以将一个特定元素放在第一位,然后按某个字段保留?

MySQL 不使用主键删除重复项

java - 解决依赖的重复版本

正则表达式用 bool 替换 bool 值

regex - Perl 正则表达式匹配替代文件名

regex - 使用 bash 和 awk 将日志文件分组

c# - 仅在填充后重新排序 TreeView 节点 [0]

django - IntegrityError 重复键值违反唯一约束 - django/postgres