2013-11-23 2 views
0

У меня проблема с 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, он добавит и продолжит мой цикл ...

Результаты (до этого, если):

WOOT COUNT: 3 HASH: HASH(0x7f88308361b8) 
WOOT COUNT: 2 HASH: HASH(0x7f883088eb28) 
WOOT COUNT: 2 HASH: HASH(0x7f8830832648) 
WOOT COUNT: 2 HASH: HASH(0x7f88308f8060) 
WOOT COUNT: 1 HASH: HASH(0x7f88308ff6f0) 

Результаты (внутри если):

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) 

А если серьезно ... Я не понимаю, почему это дает мне тот результат ... Когда, по-видимому, для меня, это почти то же самое! благодарно

Damien

+1

Этот код должен делать? –

+0

@ Hynek-Pichi-Vychodil I * think * OP пытается построить trie, но вы правы: дамп ожидаемой структуры данных + соответствующий тестовый пример был бы наиболее полезен. – amon

+2

Вместо этого: '$ dic = $ dic -> {letter}'. Разве вы не имеете в виду это: '$ dic = $ dic -> {$ letter}'? Отсутствует знак доллара. – FMc

ответ

0

Прежде всего, не делают этого:

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"; 
    } 
} 

редактировать: фиксированный $ письмо, как было отмечено @FMc

+0

Я думаю, что мне нужно выбраться немного ... спасибо за ответ! :) Это сложнее, когда perl ничего не говорит, когда есть проблема (что было очевидно, кстати): f – Damiii

Смежные вопросы