0

我有这段代码非常适合我列出属于特定值箱的对象。唯一的问题是我无法获得带有空格或制表符分隔符的输出。

use strict;
use warnings;
use 5.14.0;
my $file = "test_counter.txt";
open DATA, '<', $file or die "$!";
my %hash;
while (<DATA>){
    next if /^\s*$/m; )
    my ($key1,$key2,$val) = /^(\w.+)\|(\w.+) (1|(\d+)(\.(\d+)))$/;
    $val = int($val*10)/10;
    $hash{$val}{$key1}++;
    $hash{$val}{$key2}++;
    }
for (-10..10){
    $_ = $_/10;
    say "$_\t", $hash{$_} ? keys $hash{$_} : '';
    }

输入 test_counter.txt 文件如下所示:

data|all 0.12
cup|bed 0.16596
bed|all 0.221
cup|all 0.21123
data|bed 0.388
cup|bed 0.35
bed|data 0.412
data|all 0.5236
data|cup 0.565
bed|all 0.6174
all|cup 0.65
cup|data 0.678

我得到的输出是:

 -1 
-0.9    
-0.8    
-0.7    
-0.6    
-0.5    
-0.4    
-0.3    
-0.2    
-0.1    
0   
0.1 bedcupdataall
0.2 bedcupall
0.3 bedcupdata
0.4 beddata
0.5 cupdataall
0.6 bedcupdataall
0.7 
0.8 
0.9 
1

我想要相同的,但在对象之间有一个制表符或空格,或者理想情况下,当在 bin 中找不到对象时,一个制表符分隔的输出带有一个空白位置。像这样的东西:

 -1 
    -0.9    
    -0.8    
    -0.7    
    -0.6    
    -0.5    
    -0.4    
    -0.3    
    -0.2    
    -0.1    
    0   
    0.1 bed cup data all
    0.2 bed cup  all
    0.3 bed cup data
    0.4 bed data
    0.5  cup data all
    0.6 bed cup data all
    0.7 
    0.8 
    0.9 
    1

感谢您的任何建议!

4

1 回答 1

1

用于join将数组的所有元素与一些分隔符连接在一起:

join "\t", keys %{$hash{$_}};

例如:

say "$_\t", $hash{$_} ? join "\t", keys %{$hash{$_}} : '';
于 2013-10-25T12:54:38.303 回答