2016-07-22 49 views
0

我正在處理包含製表符分隔序列的輸入文件。序列組通過換行符分隔。該文件看起來像:如何計算散列中存在的鍵的數量?

TAGC  TAGC  TAGC  HELP 
    TAGC  TAGC  TAGC 
    TAGC  HELP 
    TAGC 

這裏是我的代碼有:

use strict; 
    use warnings; 

    open(INFILE, "<", "/path/to/infile.txt") or die $!; 

    my %hash = ( 
      TAGC => 'THIS_EXISTS', 
      GCTA => 'THIS_DOESNT_EXIST', 
    ); 

    while (my $line = <INFILE>){ 
      chomp $line; 
      my $hash; 
      my @elements = split "\t", $line; 
      open my $out, '>', "/path/to/outfile.txt" or die $!; 
      foreach my $sequence(@elements){ 
        if (exists $hash{$sequence}){ 
         print $out ">$sequence\n$hash{$sequence}\n"; 
        } 
        else 
        } 
         $count++; 
         print "Doesn't exist ", $count, "\n"; 
        } 
      } 
    } 

我怎麼知道有多少序列存在之前,我打印?我需要將該信息放入輸出文件的名稱中。

理想情況下,我會在文件名中包含一個變量。不幸的是,我不能僅僅採用@elements的標量,因爲有些序列不會被打印出來。當我嘗試將存在的鍵推入數組中,然後打印該數組的標量時,我仍然得不到所需的結果。這是我試過的(所有變量都需要全局性的):

open my $out, '>', "/path/to/file.$number.txt" or die $!;  
    foreach my $sequence(@elements){ 
      if (exists $hash{$sequence}){ 
        push(@Array, $hash{$sequence}, "\n"); 
        my $number = @Array; 
        print $out ">$sequence\n$hash{$sequence}\n"; 
      #.... 

感謝您的幫助。真的很感激它。

回答

2
my $sequences = grep exists $hash{$_}, @elements; 
open my $out, '>', "/path/to/outfile_containing_$sequences.txt" or die $!; 

在列表上下文中,grep按標準過濾列表;在標量上下文中,它返回滿足條件的元素數。

+0

這太好了。謝謝。 – Rob

0

最簡單的方法是跟蹤您在一個變量中打印多少個鍵,並且一旦循環結束,只需使用計算的數字重命名該文件即可。 Perl帶有一個內置函數來執行此操作。該代碼將是這樣的:

use strict; 
use warnings; 

open(INFILE, "<", "/path/to/infile.txt") or die $!; 

my %hash = ( 
     TAGC => 'THIS_EXISTS', 
     GCTA => 'THIS_DOESNT_EXIST', 
); 
my $ammt; 

while (my $line = <INFILE>){ 
     chomp $line; 
     my $hash; 
     my @elements = split "\t", $line; 
     open my $out, '>', "/path/to/outfile.txt" or die $!; 
     foreach my $sequence(@elements){ 
       if (exists $hash{$sequence}){ 
        print $out ">$sequence\n$hash{$sequence}\n"; 
        $ammt++; 
       } 
       else 
       } 
       print "Doesn't exist ", $count, "\n"; 
       } 
     } 
} 

rename "/path/to/outfile.txt", "/path/to/outfile${ammt}.txt" or die $!; 

我刪除了$count變量,因爲它不是在你的代碼中聲明(嚴會抱怨這一點)。 Here'srename的官方文檔。既然它返回True或False,你可以檢查它是否成功。

順便說一句,請注意:

push(@Array, $hash{$sequence}, "\n"); 

被存儲兩個項目($hash{$sequence}\n),使計數將在兩次因爲它應該是。