0

Perlを使用してファイルから一意のデータのペアを印刷する方法を理解しようとしています。

例えば、

Input: (check.pl)
A23072 A25058
A25058 A23072 
Output:
A23072 A25058

このタスクに取り組むために、check.plファイルのコピーを作成し、それを繰り返して正規表現を見つけました。次のコードを記述しましたが、データをフィルタリングできません。

#!/usr/bin/perl -w
use strict;
use warnings;
open FH, "<check.txt" || die "Error\n";
open FH1, "<checkcopy.txt" || die "Error\n";
chomp (my @array=<FH1>);
my %count=();

while (<FH>) 
{
my @values = split;
next if grep /\D/, @values or @values != 2;

my $re = qr/\A$values[0]\s+$values[1]\z|\A$values[1]\s+$values[0]\z/;

   foreach my $key (@array) 
   {
      if ((grep $_ =~ $re, $key) && (grep ++$count{$_} == 1, $key) )
      {
        print "$key\n";
      }
   }    
}
1;

どんな助けでもありがたいです!ありがとう。

4

2 に答える 2

3

値をハッシュに格納することもできます。これにより、値の検索がはるかに簡単になります。何かのようなもの:

my %duplicates;
while (<>) {
  my @values = split;
  next if @values != 2;

  my @sorted  = sort @values;
  $duplicates{ $sorted[0] } ||= {};
  next if $duplicates{ $sorted[0] }->{ $sorted[1] };

  $duplicates{ $sorted[0] }->{ $sorted[1] } = 1;
  print join(' ', @values), "\n";
}
于 2012-08-31T07:28:16.010 に答える
0

これは、を使用して同様の問題について私が見た手法ですsort

#!/usr/bin/perl
use strict;
use warnings;

my %seen;
my @array;

while (<DATA>) {
    next unless 2 == (@array = split);
    my $key = join "", sort @array;
    print unless $seen{$key}++;
}

__DATA__
A23072 A25058
A25058 A23072
于 2012-08-31T10:28:09.997 に答える