2

这是我在 perl 数组中计算 uniq 值并将它们放入哈希数组中的代码

@array=$_[0];

print Dumper @array;

my %counts;

$counts{$_}++ for @array;
print Dumper(\%counts); 

输出是:

$VAR1 = [
          -46,
          '53',
          11,
          '84',
          -2,
          '47',
          -7,
          '72',
          0,
          '14',
          -10,
          '3',
          -46,
          '53',
          11,
          '84',
          -2,
          '47',
          -7,
          '72',
          0,
          '14',
          -10,
          '3'
        ];
$VAR1 = {
          'ARRAY(0x180c844)' => 1
        };

为什么哈希数组是空的??以及如何计算 uniq 值?

4

2 回答 2

11

您有一个数组 ref in $_[0]Data::Dumper输出证明了这一点

$VAR1 = [ ....
#       ^-- array ref

所以当你这样做时

$counts{$_}++ for @array;

您正在对数组 ref 进行字符串化,它变成ARRAY(0x180c844)或类似的,然后它的键递增。

如何解决:取消引用$_[0]。复制到数组或者直接使用。

@array = @{$_[0]};

或者

$counts{$_}++ for @{$_[0]};

您应该注意,在检查唯一数字时,如果看起来不同的数字应该被视为相同,您可能会遇到问题,例如1.01。您可能希望事先对数字进行标准化,如下所示:

$counds{ 0+$_ }++ for @array;
于 2013-09-21T02:10:50.423 回答
0

您只是将数组复制到数组引用中。 perl 是根据上下文解释的。

尝试:

@array=@{$_[0]};

print Dumper @array;

my %counts;

map { $counts{$_}++ } @array;
print Dumper(\%counts); 

编辑:我最初使用了自己的输入,而不是初始变量中的数组引用。建议的取消引用应该修复它。

于 2013-09-21T02:04:32.113 回答