1

私はコードのこの部分に数時間を費やしましたが、それを機能させる方法がまだわからないので、どんな提案も素晴らしいでしょう!


list1.txtとdictionary.txtの2つのファイルがあります。list1.txtは次のようになります

rs1
rs2
rs4
rs5

dictionary.txtは次のようになります

rs1 1 A G
rs2 2 C T
rs3 3 A A
rs4 4 G G

列はスペースで区切られます-4つの列があります。私がやりたいのは、list1.txtの単語ごとに、dictionary.txtでその単語を検索し、存在する場合は、dictionary.txtの行全体を3番目のファイルに出力することです。その単語がdictionary.txtに存在しない場合は、その単語を印刷してください。

したがって、上記のファイルを使用して以下のプログラムを実行すると、結果は次のようになります。

rs1 1 A G
rs2 2 C T
rs4 4 G G
rs5

前述のプログラム:

open(LIST1, '<', 'test_chr1_22.txt') or die "Could not open chr1_22.txt: $!";

open(OUTPUT, '>', 'test_chr1_22_all_info.txt');

foreach my $line1 (<LIST1>)
{
        foreach my $line (@DICT)
        {
            if ($line =~ m/"$line1"/)
            {
                print OUTPUT"$line\n";
            }
        }
}

これは私が今持っているコードです。2番目の条件がないことはわかっています。つまり、単語が辞書に存在しない場合は、その単語を印刷するだけです。ただし、最初の部分を理解することすらできません。つまり、単語が辞書にある場合は、その行を印刷します。これから得られるものは空白のテキストファイルです。誰が何が起こっているのか知っていますか?

4

1 に答える 1

3

m/"$line1"/は多くの理由で間違っています:

  • 一致する文字列に が含まれてい"ないため、これは一致しません。
  • $line1の内容をエスケープして、任意のテキストから正規表現を形成することはありません。
  • テキストが文字列の先頭にある場合にのみ一致させます。
  • テキストがフィールド全体である場合にのみ一致させます。

とにかく、非常に非効率的なネストされたループをループとハッシュルックアップに置き換えると、正規表現の一致の必要性がなくなります。

my %dict;
while (<$DICT>) {
   my ($key) = split;
   $dict{$key} = $_;
}

while (<$INPUT>) {
   my ($key) = split;
   print $dict{$key} // $_;
}
于 2012-12-03T09:22:16.757 に答える