我有这样的文件。
>;1;
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
>;2;
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
>;3;
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
我想将每个数字更改为相应的字符串。
我写了以下Perl程序,但我不知道它有什么问题。
%lista2 = (
1 => "CAT00.3",
2 => "CAT43.1",
3 => "CAT40.3"
);
open(OA, ">file2.txt");
foreach $key ( keys %lista2 ) {
open(SAL, "file.txt");
while ( <SAL> ) {
chomp;
if( />/ ) {
@w = split("\t");
$r = 0;
s/\;//g;
if ( /%lista2[i]/ ) {
print OA "$_ $lista2{$key}\n" ;
$r = 1;
}
}
}
}
close(SAL);
close(OA);
我想得到这个
>CAT00.3
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
>CAT43.1
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
>CAT40.3
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
但我不知道那是怎么回事。
答案 0 :(得分:2)
我想你是在正确的方向。但是在路径的某个地方,你我们迷失了,似乎随机试图向任何方向奔跑。您的代码中存在许多错误。
例如,如何拥有这两行
很有趣 if ( /%lista2[i]/ ) {
print OA "$_ $lista2{$key}\n" ;
正确尝试访问has值($lista2{$key}
)和完全错误的值(%lista2[i]
)如此接近。
然后,由于您只打印到OA
if("/$lista2{$key}/"
),因此您将完全根除输出中的所有其他行。您的示例表明,您不希望这样。
此外,更改循环嵌套。而不是一遍又一遍地打开文件,打开它一次,遍历行,并在每次这样的迭代中迭代哈希键。你知道,你的方式并没有严格错误,但打开和关闭文件并不便宜。说到关闭文件:你没有在你的外环体中关闭SAL
,但那是你重新打开它的地方。
至少使用一些非常基本的错误处理。检查open
是否失败。错误的文件名和程序失败,没有任何指示原因。让你的生活更轻松。
如果您稍后在输出中添加chomp()
并再次输出一行,为什么要使用\n
?跳过那个。
我不知道如何解释这些行:
@w = split("\t");
$r = 0;
s/\;//g;
那是剩饭吗?他们没有做任何有用的事情。
最后但并非最不重要的是,建议use strict;
和可能use warnings;
获取有关问题点的指示。
这是一个通过你的例子。
#!/usr/bin/perl
use strict;
use warnings;
my %lista2 =
(
1 => "CAT00.3",
2 => "CAT43.1",
3 => "CAT40.3"
);
if (!open(OA, ">file2.txt")) {
die($!);
}
if (!open(SAL, "file.txt")) {
die($!);
}
foreach my $line (<SAL>) {
foreach my $key (keys(%lista2)) {
if ($line =~ s/^>;$key;$/>$lista2{$key}/) {
last;
}
}
print(OA $line);
}
close(SAL);
close(OA);
事实上,在核心中它可以简化为模式替换。不需要分裂或任何东西。但如果你是初学者,模式可能会令人困惑。
我也提高了冗长程度以使事情变得更清楚。