1

我有一个这样的文件。

>;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

但我不知道该怎么做。

4

1 回答 1

2

好吧,我猜你的方向是对的。但是在你走的路上的某个地方,我们迷路了,似乎随机地试图向任何方向奔跑。您的代码中有很多错误。

例如,这两条线很有趣

        if ( /%lista2[i]/ ) {    
            print OA "$_ $lista2{$key}\n" ;

一次正确的尝试访问 a 的值 ( $lista2{$key}) 和一个完全错误的 ( %lista2[i]) 如此接近。

然后,由于您只打印到OAif ( "/$lista2{$key}/"),因此您将完全消除输出中的所有其他行。您的示例表明,您不希望那样。

此外更改循环嵌套。与其一遍又一遍地打开文件,不如打开它一次,遍历行,并在每次这样的迭代中遍历哈希键。你的方法并没有完全错误,但打开和关闭文件并不便宜,你知道的。说到关闭文件:你没有SAL在你的外循环体中关闭,但那是你重新打开它的地方。

并至少使用一些非常基本的错误处理。检查是否open失败。错误的文件名和程序失败,没有任何说明原因。让您的生活更轻松。

chomp()如果您以后\n无论如何都将 an 添加到输出并再次制作一行,为什么还要使用它?跳过那个。

我不知道如何解释这些行:

        @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);

事实上,在核心中它可以简化为模式替换。不需要分裂或任何东西。但如果您是初学者,模式可能会令人困惑。

我还提高了详细程度以使事情更清晰。

于 2018-04-28T04:44:54.227 回答