![](/img/trans.png)
[英]how to compare a hash key of a one file with a hash value of another in perl
[英]How to change a name in a file for another in perl with hash?
我有一个这样的文件。
>;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
但是我不知道该怎么做。
好吧,我想您的方向正确。 但是沿着这条路的某个地方,我们迷路了,似乎随机地试图朝任何方向奔跑。 您的代码中有很多错误。
例如,有趣的是,如何拥有这两行
if ( /%lista2[i]/ ) {
print OA "$_ $lista2{$key}\n" ;
进行一次正确的尝试访问具有一个值( $lista2{$key}
)和一个完全错误的%lista2[i]
( %lista2[i]
),因此%lista2[i]
接近。
然后,由于仅在if( "/$lista2{$key}/"
)上打印到OA
,因此您将彻底消除输出中的所有其他行。 您的示例表明,您不想要那样。
此外,更改循环嵌套。 不必一遍又一遍地打开文件,而是将其打开一次,遍历各行,并在每次此类迭代中遍历哈希键。 您知道,您的方式并非严格错误,但是打开和关闭文件并不便宜。 说到关闭文件:您没有在外部循环的主体中关闭SAL
,但这是您重新打开它的地方。
并至少使用一些非常基本的错误处理。 检查open
是否失败。 文件名错误,程序失败,没有任何原因。 让您的生活更轻松。
如果以后再将\\n
附加到输出中并重新制作一行,为什么还要使用chomp()
? 跳过那个。
我不知道如何解释这些行:
@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);
实际上,在核心上它可以简化为模式替换。 无需拆分或任何其他操作。 但是,如果您是初学者,则模式可能会造成混淆。
我还提高了详细程度,以使事情更清楚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.