1

以下のコードをPerlで記述しましたが、望ましい出力が得られません。1つの配列と2つの配列のハッシュの比較を扱っています。

与えられたサンプル入力ファイル:

1) file1.txt
   A6416    A2318
   A84665   A88

2)hashone.pl

%hash1=(
A6416=>['E65559', 'C11162.1', 'c002gnj.3',],
A88=>['E77522', 'M001103', 'C1613.1', 'c001hyf.2',],
A84665=>['E138347', 'M032578', 'C7275.1', 'c009xpt.3',],
A2318=>['E128591', 'C43644.1', 'C47705.1', 'c003vnz.4',],
);

3)hashtwo.pl

%hash2=(
15580=>['C7275.1', 'E138347', 'M032578', 'c001jnm.3', 'c009xpt.2'],
3178=>['C1613.1', 'E77522','M001103', 'c001hyf.2', 'c001hyg.2'],
24406=>['C11162.1', 'E65559', 'M003010', 'c002gnj.2'],
12352=>['C43644.1', 'C47705.1', 'E128591','M001458', 'c003vnz.3'],
);

私の目的は、説明されているタスクを達成することです。

file1.txtから、対応するIDを%hash1で見つける必要があります。たとえば、A6416(file1.txt)は%hash1のキーです。次に、%hash2でA6416 ['E65559'、'C11162.1'、'c002gnj.3'、]の値を見つける必要があります。値の大部分(50%以上)が%hash2で見つかった場合、A6416を%hash2の対応するキーに置き換えます。

Example:
A6416 A2318 
A84665 A88

Output:
24406 12352
15580 3178

%hash1と%hash2のキーは異なることに注意してください(重複していません)。ただし、値は同じです(重複しています)。

#!/usr/bin/perl -w
use strict;
use warnings;
open FH, "file1.txt" || die "Error\n";
my %hash1 = do 'hashone.pl';     
my %hash2 = do 'hashtwo.pl';  
chomp(my @array=<FH>);

foreach my $amp (@array)
{
    if ($amp =~ /(\d+)(\s?)/)
    {
        if (exists ($hash1{$1}))
        {
            for my $key (keys %hash2) 
            {
                for my $i ( 0 .. $#{ $hash2{$key} } ) 
                {
                    if ((@{$hash1{$1}}) eq ($hash2{$key}[$i]))
                    { 
                    print "$key";
                    }
                }
           }
        }
    }
}   
close FH;
1;

この問題に関するガイダンスは高く評価されています。ありがとうございました!

4

2 に答える 2

3

%hash2この構造に逆にする必要があると思います:

$hash2{'C7275.1'} = $hash2{'E138347'} = $hash2{'M032578'}
                  = $hash2{'c001jnm.3'} = $hash2{'c009xpt.2'} = 15580;
$hash2{'C1613.1'} = $hash2{'E77522'} = $hash2{'M001103'}
                  = $hash2{'c001hyf.2'} = $hash2{'c001hyg.2'} = 3178;
$hash2{'C11162.1'} = $hash2{'E65559'}
                   = $hash2{'M003010'} = $hash2{'c002gnj.2'} = 24406;
$hash2{'C43644.1'} = $hash2{'C47705.1'} = $hash2{'E128591'}
                   = $hash2{'M001458'} = $hash2{'c003vnz.3'} = 3178;

のすべての要素のすべての要素を反復処理するのではなく、これらのルックアップをより効果的に実行できるようにします%hash2

于 2012-08-26T16:08:20.150 に答える
1

ここで ruakh と zock からの応答に基づいて構築するのは、hash2 のルックアップ テーブルを構築するために必要なコードです。

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %hash2=(
15580=>['C7275.1', 'E138347', 'M032578', 'c001jnm.3', 'c009xpt.2'],
3178=>['C1613.1', 'E77522','M001103', 'c001hyf.2', 'c001hyg.2'],
24406=>['C11162.1', 'E65559', 'M003010', 'c002gnj.2'],
12352=>['C43644.1', 'C47705.1', 'E128591','M001458', 'c003vnz.3'],
);

# Build LUT for hash2
my %hash2_lut;
foreach my $key (keys %hash2)
{
    foreach my $val (@{$hash2{$key}})
    {
        $hash2_lut{$val} = $key
    }
}

print Dumper(\%hash2_lut);

コードを明確にするために、答えとして ruakh の投稿を選択してください。使っData::Dumperて...それはあなたの友達です。

出力は次のとおりです。

$VAR1 = {
      'C47705.1' => '12352',
      'M032578' => '15580',
      'E138347' => '15580',
      'E77522' => '3178',
      'C7275.1' => '15580',
      'c001jnm.3' => '15580',
      'E65559' => '24406',
      'C1613.1' => '3178',
      'M001458' => '12352',
      'c002gnj.2' => '24406',
      'c009xpt.2' => '15580',
      'c001hyf.2' => '3178',
      'C43644.1' => '12352',
      'E128591' => '12352',
      'c001hyg.2' => '3178',
      'M003010' => '24406',
      'c003vnz.3' => '12352',
      'C11162.1' => '24406',
      'M001103' => '3178'
    };
于 2012-08-27T22:55:37.970 に答える