Просмотр полной версии : [Perl] Кодирование строки по Хаффману
Доброго времени суток. Пишу программу, которая должна кодировать введенную строку по методу Хаффмана, вот пока что получилось:
#!/usr/bin/perl -w
print "Введите строку: ";
$string = <STDIN>;
chomp $string;
# Заполняем массив @symbols символами из строки
@symbols = split(//, $string);
for ($a = 0; $a < @symbols; $a++) {
$number[$a] = 0;
}
# Считаем частоту символов в строке
for ($i = 0; $i < @symbols-1; $i++) {
if ($number[$i] == 0) {
$count = 1;
$number[$i] = 1;
$t = $i + 1;
print $t;
for ($j = $t; $j < @symbols; $j++) {
$one = substr($string,$i,1);
$two = substr($string,$j,1);
if ( ($one eq $two) and ($number[$j] == 0) ) {
$number[$j] = 1;
$count++;
}
}
$tmp = substr($string,$i,1);
print "$tmp - $count\n";
}
}
Каким образом мне дальше действовать? использовать хеш таблицу или что то другое? язык для меня новый и все его возможности я пока незнаю.
И если есть возможность как то упростить задачу, буду рад предложениям.
Спасибо за внимание!
Pashkela
10.01.2010, 09:40
http://search.cpan.org/dist/Algorithm-Huffman/Huffman.pm
Установил Heap::Fibonacci, но выдает ошибку:
Can't locate Heap/Fibonacci.pm in @INC (@INC contains: /etc/perl
/usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0
/usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10
/usr/local/lib/site_perl .) at /usr/local/share/perl/5.10.0/Algorithm/Huffman.pm line 14.
BEGIN failed--compilation aborted at /usr/local/share/perl/5.10.0/Algorithm/Huffman.pm line 14.
Compilation failed in require at haffman.pl line 3.
BEGIN failed--compilation aborted at haffman.pl line 3.
как исправить?
Pashkela
10.01.2010, 19:39
вообще-то там все написано, чего не хватает и где именно.
ну после установки модуля Fibonacci, я не нашел файл Heap/Fibonacci.pm, который запрашивается в ошибке
Все, с модулями разобрался, установил вроде все требуемые.
Когда запускаю программу на выполнение пишет:
Not a HASH reference at /usr/local/share/perl/5.10.0/Algorithm/Huffman.pm line 198.
Открываю файл Huffman.pm:
sub new {
my ($proto, $key, $value) = @_;
my $class = ref($proto) || $proto;
my $self = $class->SUPER::new;
$self->{"KeyValuePair::key"} = $key; # строка 198
$self->{"KeyValuePair::value"} = $value;
return $self;
}
Что это за ошибка?
http://www.cpan.org/modules/
Здесь вообще могут быть модули с ошибками?
Pashkela
11.01.2010, 22:31
вряд ли. Лучше почитай, как правильно устанавливать модули
Читал, модули я поставил верно, но при интерпретации алгоритма(файл Huffman.pm) с cpan.org пишет: Not a HASH reference, и как мне исправить эту ошибку, и вообще должна ли она появлятся в подобном случае?
Мои предыдущие действия были такие:
1. Перешел по ссылке http://search.cpan.org/dist/Algorithm-Huffman/Huffman.pm скопировал в файл haffman.pl код с этого сайта:
use Algorithm::Huffman;
my %char_counting = map {$_ => int rand(100)} ('a' .. 'z', 'A' .. 'Z');
# or better the real counting for your characters
# as the huffman algorithm doesn't work good with random data :-))
my $huff = Algorithm::Huffman->new(\%char_counting);
my $encode_hash = $huff->encode_hash;
my $decode_hash = $huff->decode_hash;
my $encode_of_hello = $huff->encode_bitstring("Hello");
print "Look at the encoding bitstring of 'Hello': $encode_of_hello\n";
print "The decoding of $encode_of_hello is '", $huff->decode_bitstring($encode_of_hello), "'";
2. Установил через CPAN модуль Algorithm::Huffman
3. После команды: perl haffman.pl выдает код ошибки: Not a HASH reference at /usr/local/share/perl/5.10.0/Algorithm/Huffman.pm line 198.
Вот собственно и вся ошибка.
Кому будет не сложно повторите эти действия, может дело в самом модуле Algorithm::Huffman и имеет смысл писать свой собственный?
Подскажите как исправить это предупреждение, о плохой работе алгоритма:
my %char_counting = map {$_ => int rand(100)} ('a' .. 'z', 'A' .. 'Z');
# or better the real counting for your characters
# as the huffman algorithm doesn't work good with random data :-))
?
Не знаю, как вы со CPAN-а поставили модуль, который не проходит make test. Строка в примере
my %char_counting = map {$_ => int rand(100)} ('a' .. 'z', 'A' .. 'Z');
правильная, формируется хэш, ссылка на который и передается конструктору new. Имхо, фтопку модуль, ищите другие варианты, в гугле куча ссылок
Все эти ссылки ссылаются на этот же модуль со cpan.org, как отладить тогда существующий?
Проблем решена. Нашел другое решение в сети: http://eli.thegreenplace.net/files/prog_code/huff.pl.txt
krypt3r, Pashkela - спасибо за помощь.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot