Perl 不';我不想引用散列的散列

Perl 不';我不想引用散列的散列,perl,hash,reference,Perl,Hash,Reference,我对perl有一个问题,我真的不知道为什么会发生这种情况。。。 问题在于: sub rem_word{ my ($self,$word) = @_; my $dic = $self; my @word = split(//,$word); my $count ; my $first = 1; for my $letter(@word){ $count = scalar (keys %$dic);

我对perl有一个问题,我真的不知道为什么会发生这种情况。。。 问题在于:

sub rem_word{
    my ($self,$word) = @_;
    my $dic = $self;

    my @word = split(//,$word);
    my $count ; 
    my $first = 1;

    for my $letter(@word){
            $count = scalar (keys %$dic);

            #$dic = $dic->{$letter};

            if($dic->{$letter}){
                    print "ELEMENTOS KEYS : $count\n";
                    $dic = $dic->{letter};
            }
            print "WOOT COUNT: $count HASH: $dic\n";
    }
}
如果我把指令“$dic=$dic->{letter}”放在我的“If”。。。似乎它没有添加。。。但是,如果我把它放在If之前,它将添加并继续我的循环

结果(在if之前):

结果(如有):

说真的。。。我不明白为什么它会给我这个结果。。。显然,对我来说,这几乎是一样的事情! 感激地


达米恩首先,不要那样做:

my@word=split(/,$word)

然后,有以下几点,这就是为什么这段代码不能满足您的要求:

$dic=$dic->{letter}

因此,
$dic
是对散列的引用,现在您给它一个散列值

不要给不同的变量赋予相同的名称,即使它们不是相同的类型。这将导致混乱

sub rem_word{
    my ($self,$word) = @_;
    my $dic = $self;

    my @lword = split(//,$word);
    my $count ; 
    my $first = 1;

    for my $letter(@lword){
            $count = scalar (keys %$dic);
            my $found ; 
            if($dic->{$letter}){
                    print "ELEMENTOS KEYS : $count\n";
                    $found = $dic->{$letter};
            }
            print "WOOT COUNT: $count HASH: $found\n";
    }
}

edit:fixed$letter,正如@FMc

所指出的,这段代码应该做什么?@Hynek Pichi Vychodil我认为OP正在尝试构建一个trie,但你是对的:一个预期数据结构的转储+相应的测试用例将是最有帮助的。取而代之的是:
$dic=$dic->{letter}
。你的意思是:
$dic=$dic->{$letter}
?美元符号不见了。我想我得出去一下。。。谢谢你的回复!:)如果perl在出现问题时什么都不说(顺便说一句,这是显而易见的),那就更难了:f
WOOT COUNT: 3 HASH:
WOOT COUNT: 0 HASH: HASH(0x7fb6918018c8)
WOOT COUNT: 0 HASH: HASH(0x7fb6918018c8)
WOOT COUNT: 0 HASH: HASH(0x7fb6918018c8)
WOOT COUNT: 0 HASH: HASH(0x7fb6918018c8)
sub rem_word{
    my ($self,$word) = @_;
    my $dic = $self;

    my @lword = split(//,$word);
    my $count ; 
    my $first = 1;

    for my $letter(@lword){
            $count = scalar (keys %$dic);
            my $found ; 
            if($dic->{$letter}){
                    print "ELEMENTOS KEYS : $count\n";
                    $found = $dic->{$letter};
            }
            print "WOOT COUNT: $count HASH: $found\n";
    }
}