以下のコードを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;
この問題に関するガイダンスは高く評価されています。ありがとうございました!