我有一个我之前写的代码。
我尝试使用它,但出现此错误Type of arg 1 to keys must be hash or array (not hash element) at line 18, near "} :"
,无法弄清楚如何解决。
代码是这个
use strict;
use warnings;
use 5.12.0;
my $file = "test.txt";
open DATA, '<', $file or die "$!";
my %hash;
while(<DATA>){
next if /^\s*$/m; # In case if you have empty lines.
my ($key1,$key2,$val) = /^(\w)\|(\w) ([0-9.-]+)/;
$val = int($val*10)/10;
$hash{$val}{$key1}++;
$hash{$val}{$key2}++;
}
for (-9..9){
$_ = $_/10;
say "$_\t",ref $hash{$_} ? scalar keys $hash{$_} : '';
}
我的test.txt
是
PBANLA_7 PBANLA_9 -0.976
PBANLA_2 PD39238 0.8
PD3_1 PD3_12 -0.76
PBANLA_13 PBANLA31 2563.654
PD3_91 PD3_342 0.1
PD3_23 PD3_84 1.5968E-05
PBANLA_3 PBANLA_2 108
PFC10_API0060 MAL13.1006 -1
PRA0005w MAL13.100 -0.17
PRA0005w MAL13.102 -0.17
PTA0005w MAL13.103 -0.17
PRA0005w MAL13.105 -0.175968E-06
PTA0005w MAL13.106 -0.17564
PRA0005w MAL13.107 -0.17
PRA0005w MAL13.108 30
我想要的输出是每个bin中的ID(第一列和第二列)的计数。 欢迎提出建议! 提前致谢, gabelins
答案 0 :(得分:3)
在低于v5.14( edit :且高于v5.22)的perl版本中,keys
的参数必须是哈希,而不是哈希引用。您必须取消引用哈希引用,以使其成为keys
的有效参数。
%hash = (abc => 123);
$hashref = { def => 456 };
@k = keys %hash; # ok
@k = keys $hashref; # error in perl <v5.14
@k = keys %{$hashref}; # ok
即使在版本5.14到5.22中,keys HASHREF
也被认为是“实验性的”,并且在以后的版本中可能会发生变化。