如何计算哈希中存在的键数?

时间:2016-07-22 00:30:03

标签: arrays perl variables hash exists

我正在使用包含制表符分隔序列的输入文件。序列组由换行符分隔。该文件看起来像:

    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 个答案:

答案 0 :(得分:2)

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

在列表上下文中,grep按标准过滤列表;在标量上下文中,它返回符合标准的元素计数。

答案 1 :(得分: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's rename的官方文件。由于它返回True或False,您可以检查它是否成功。

顺便提一下,请注意:

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

正在存储两个项目($hash{$sequence}\n),因此计数将是应有的两倍。