删除perl哈希中的冗余

ana*_*ana -1 perl

我有一个看起来像这样的文件.

a_8_3_1-b_30_5_6-c_6_2_1- + b_30_5_6-
a_123_1_1- + d_144_1_7-
a_123_1_1- + c_1_4_1-
b_50_1_1- + d_144_1_7-
a_123_1_1- + c_2_1_2-
c_1_4_1- + a_123_1_1-
a_123_1_1- + a_93_1_2-
d_144_1_7- + a_123_1_1-
c_2_1_2- + a_123_1_1-
a_123_1_1- + c_2_1_2-
Run Code Online (Sandbox Code Playgroud)

它有2列,用"+"符号分隔.我需要计算此文件中存在的唯一组合的数量.

如图所示,形成组合,例如在a_123_1_1-和c_2_1_2-之间,以及在c_2_1_2- + a_123_1_1-之间.现在我需要数不了.在这样的文件中出现这种对的情况,我知道这种组合(不论它们的相对顺序)发生了3次.

与a_123_1_1-和d_144_1_7-类似.它们以两种组合出现.每个组合出现一次.因此,累计计数= 2

我现在已经尝试将所有这些行放在哈希中(即每一行都是一个键,它的出现将是它的相应值)并打印出no.在PERL中使用map函数的出现次数.

但是,我如何包含这样的冗余并在各个元素之间解决这个问题?

请帮忙.

Fil*_*efp 5

与处理perl时一样,有多种方法可以做到,但你可以:

  1. 拆分每一行,以便产生两个条目的@pair
  2. 对@pair进行排序,以便唯一的对将始终产生相同的顺序
  3. 将已排序的@pair连接起来,以便得到一个字符串
  4. 将您的字符串存储在%哈希中并计算出现次数

如下例所示:

use warnings;
use strict;

use Data::Dumper;

my %count;

for (<DATA>) { chomp;
  my $str_pair = join ':', sort split / \+ /;
  $count{$str_pair}++;
}

print STDERR Dumper \%count;

__DATA__
a_8_3_1-b_30_5_6-c_6_2_1- + b_30_5_6-
a_123_1_1- + d_144_1_7-
a_123_1_1- + c_1_4_1-
b_50_1_1- + d_144_1_7-
a_123_1_1- + c_2_1_2-
c_1_4_1- + a_123_1_1-
a_123_1_1- + a_93_1_2-
d_144_1_7- + a_123_1_1-
c_2_1_2- + a_123_1_1-
a_123_1_1- + c_2_1_2-
Run Code Online (Sandbox Code Playgroud)

产量

$VAR1 = {
          'a_8_3_1-b_30_5_6-c_6_2_1-:b_30_5_6-' => 1,
          'a_123_1_1-:c_2_1_2-' => 3,
          'a_123_1_1-:c_1_4_1-' => 2,
          'a_123_1_1-:a_93_1_2-' => 1,
          'b_50_1_1-:d_144_1_7-' => 1,
          'a_123_1_1-:d_144_1_7-' => 2
        };
Run Code Online (Sandbox Code Playgroud)