簡體   English   中英

如何用哈希在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM