Perl:搜索和替换

时间:2015-06-03 18:08:56

标签: perl dictionary substitution

我正在尝试改进我希望匹配input.txt中字符的脚本(第4列:H12HBCA,{{1} })到HB3并替换为dictionary.txt中的相应字符(第2列:dictionary.txtHHBC)。使用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

1 个答案:

答案 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