Разыменование Perl хэш-ссылок - PullRequest
5 голосов
/ 22 июля 2011

Используя Text::Ngram У меня есть

my $c = ngram_counts($text, 3);
my %ct = %($c);

, который не работает (Scalar found where operator expected). Я думаю, что это комбинация незнания того, что я делаю (все еще не очень хорошо с Perl), и путаницы в том, что именно я получаю как вывод из Text :: Ngram. Помогите? Я просто хочу посмотреть на сгенерированные n-граммы:

my @keys = sort {$ct{$a} cmp $ct{$b} } keys %ct;
foreach my $k (@keys) {
    print "$k: $ct{$k}\n"
}

Редактировать: глупая ошибка с моей стороны, спасибо всем.

Ответы [ 4 ]

13 голосов
/ 22 июля 2011

Используйте фигурные скобки для разыменования ссылки на хэш:

my %ct = %{ $ct };  # %$ct would also work

И вы, вероятно, захотите использовать <=> для числовой сортировки вместо ASCII-бетической сортировки cmp.

6 голосов
/ 22 июля 2011

Используйте фигурные скобки:

my %ct = %{ $c };
3 голосов
/ 22 июля 2011

Нет необходимости делать копию в другой хеш, просто используйте ссылку.

my $c = ngram_counts($text, 3);

my @keys = sort {$c->{$a} <=> $c->{$b} } keys %$c;
foreach my $k (@keys) {
    print "$k: $c->{$k}\n"
}

См. http://perlmonks.org/?node=References+quick+reference для некоторых легко запоминающихся правил работы со ссылками.

0 голосов
/ 22 июля 2011

Вы бы попробовали это?

my $c = ngram_counts({}, $text, 3);
...