Я ломаю голову над задачей Perl в моем курсе по обработке естественного языка, который нам поручено решать.
То, что они требуют, чтобы мы могли решать с помощью Perl, таково:
Ввод: программа получает два ввода из стандартного ввода в форме и типе;perl program.pl
Обработка и вывод:
Часть 1: программа разбивает слова на слова в filename.txt и сохраняет эти слова в хэше с частотой их появления
Часть 2: программа использует ввод для целей хеширования.Если слово не может быть найдено в хэше (то есть в тексте), выводится ноль в качестве частоты слова.Если слово МОЖЕТ быть действительно найдено в хэше, распечатывает соответствующее значение частоты слова в хэше.
Из опыта я уверен, что мой сценарий уже способен делать "Часть 1 », указанная выше.
Часть 2 должна быть выполнена с использованием подпрограммы Perl (подпрограммы), которая принимает хэш по ссылке вместе с хешем для.Это была часть, с которой у меня были серьезные проблемы.
Первая версия до серьезных изменений, предложенных Стефаном Беккером;
#!/usr/bin/perl
use warnings;
use strict;
sub hash_4Frequency
{
my ($hashWord, $ref2_Hash) = @_;
print $ref2_Hash -> {$hashWord}, "\n"; # thank you Stefan Becker, for sobriety
}
my %f = (); # hash that will contain words and their frequencies
my $wc = 0; # word-count
my ($stdin, $word_2Hash) = @ARGV; # corrected, thanks to Silvar
while ($stdin)
{
while ("/\w+/")
{
my $w = $&;
$_ = $";
$f{lc $w} += 1;
$wc++;
}
}
my @args = ($word_2Hash, %f);
hash_4Frequency(@args);
Вторая версия после некоторых изменений;
#!/usr/bin/perl
use warnings;
use strict;
sub hash_4Frequency
{
my $ref2_Hash = %_;
my $hashWord = $_;
print $ref2_Hash -> {$hashWord}, "\n";
}
my %f = (); # hash that will contain words and their frequencies
my $wc = 0; # word-count
while (<STDIN>)
{
while (/\w+/)
{
chomp;
my $w = $&;
$_ = $";
$f{$_}++ foreach keys %f;
$wc++;
}
}
hash_4Frequency($_, \%f);
Когда я выполняю «./script.pl
Use of uninitialized value $hashWord in hash element at
./word_counter2.pl line 35.
Use of uninitialized value in print at ./word_counter2.pl line 35.
На что Perl жалуется для второй версии;
Can't use string ("0") as a HASH ref while "strict refs" in use at ./word_counter2.pl line 13, <STDIN> line 8390.
По крайней мере, теперь я знаю, что сценарий может успешно работать до этого самого последнего момента, и он кажется чем-то семантическим, а не синтаксическим.
Есть еще какие-нибудь советы по этой последней части?Был бы очень признателен.
PS: Извините, паломники, я просто новичок на пути Perl.