【问题标题】:How to count the number of keys that exist in a hash?如何计算哈希中存在的键数?
【发布时间】:2016-11-25 18:20:33
【问题描述】:

我正在处理一个包含制表符分隔序列的输入文件。序列组由换行符分隔。该文件如下所示:

    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"; 
             #.... 

感谢您的帮助。真的很感激。

【问题讨论】:

    标签: arrays perl variables hash exists


    【解决方案1】:
    my $sequences = grep exists $hash{$_}, @elements;
    open my $out, '>', "/path/to/outfile_containing_$sequences.txt" or die $!; 
    

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

    【讨论】:

    • 这很棒。谢谢。
    【解决方案2】:

    最简单的方法是跟踪您在变量中打印了多少键,一旦您的循环完成,只需用您计算的数字重命名文件即可。 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),因此计数将是应有的两倍。

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 2022-07-06
      • 2014-09-16
      • 2020-03-20
      • 2019-11-26
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多