我正在尝试改进我希望匹配input.txt
中字符的脚本(第4列:H1
,2HB
,CA
,{{1} })到HB3
并替换为dictionary.txt
中的相应字符(第2列:dictionary.txt
,H
,HB
,C
)。使用3HB
作为字典:
input.txt中
dictionary.txt
dictionary.txt
1 N 22 H1 MET
1 H 32 2HB MET
1 C 40 CA MET
2 H 35 HB3 ASP
输出
MET H H1
MET HB 2HB
MET C CA
ASP 3HB HB3
我试图通过首先匹配1 N 22 H MET
1 H 32 HB MET
1 C 40 C MET
2 H 35 3HB ASP
(MET)和input.txt
(MET)中的单词然后执行替换来解决此问题。这是我到目前为止所写的:
dictionary.txt
答案 0 :(得分:3)
问题似乎是您要将单个字段$columns[3]
分配给数组@name
,然后期望在$name
中找到它,这是一个单独的变量。您甚至可以在比较点声明$name
您还在执行声明
$line =~ s/$name/$dictionary{$ref_nuc}/;
哈希中的每个键一次。这是不必要的:它只需要完成一次。最好将$columns[3]
的值更改为$dictionary{$columns[3]}
,而不是在整行上进行搜索和替换,因为目标字符串可能出现在您不想修改的其他列中< / p>
通过构建字典哈希并用字典查找替换输入文件的第四个字段来做很简单
use strict;
use warnings;
use 5.010;
use autodie;
open my $fh, '<', 'dictionary.txt';
my %dict;
while ( <$fh> ) {
my ($k, $v) = (split)[2,1];
$dict{$k} = $v;
}
open $fh, '<', 'input.txt';
while ( <$fh> ) {
my @fields = split;
$fields[3] = $dict{$fields[3]};
say join "\t", @fields;
}
<强>输出强>
1 N 22 H MET
1 H 32 HB MET
1 C 40 C MET
2 H 35 3HB ASP