为什么我会收到“匿名哈希中奇数个元素”警告

时间:2013-11-24 21:56:42

标签: perl hash

我在perl代码中收到警告,不知道为什么......

警告:

Odd number of elements in anonymous hash at /Users/../Tree.pm line 56.

这给了我那条线:

$dic->{$firstLetter}={$letra};

实施有问题吗?

我的意思是,它通过了所有的测试,但它给了我这些错误......就像在同一条线上的10次! 请接受一些建议! :)

sub add_word{
    my ($self,$word) = @_ ;
    my $dic = $self->{'dic'};
    my @array = split(//,$word);
    my $firstLetter = shift @array;
    for my $letra(@array){
            if(!$dic->{$firstLetter}){
                    $dic->{$firstLetter} = {$letra};
                    $dic = $dic->{$firstLetter};
            }
            else{
                    if($dic->{$firstLetter}){
                            $dic = $dic->{$firstLetter};
                    }
            }
            $firstLetter = $letra;
    }
    $dic->{$firstLetter} = {"\$" => "\$"};
}

2 个答案:

答案 0 :(得分:4)

= {$letra}正在创建一个带有键但没有值的hashref并试图分配它。

您可能只想分配您拥有的标量:

$dic->{$firstLetter} = $letra;

虽然你可能想要:

$dic->{$firstLetter} = { someKey => $letra };

$dic->{$firstLetter} = { $letra => "someValue" };

答案 1 :(得分:1)

开启warnings是件好事。在{ ... }等表达式中使用{$letra}时,您构建的是匿名哈希引用。哈希想用键/值对初始化。所以当你写

$dic->{$firstLetter}={$letra};

这与

几乎相同
my %anon = ( $letra );
$dic->{$firstLetter} = \%anon;

该哈希将被搞砸,因为它有一个键但没有值。因此,哈希在构造时希望拥有一个偶数大小的列表,因此每个键都有一个值。如果你有一个奇数大小的列表,它会发出警告。

我的猜测是你可能只想分配一个简单的标量。所以试试

$dic->{$firstLetter} = $letra;

不要害怕空格键。 :)它使事情更容易阅读。