Perl подпрограммы

Здесь я исправил большинство моих ошибок и спасибо всем, любые другие советы, пожалуйста, с моим хэшем на данный момент и как я могу очистить каждое слово и поместить слово и его частоту в хеш, исключая пустые слова... Я думаю, мой код сделать с тех пор.

2 ответа

Таким образом, вы можете сосредоточиться на ключевой части алгоритма, как насчет принятия ввода на STDIN и вывода на STDOUT. Таким образом, нет проверки аргументов и т. Д. Просто:

$ prog < words.txt

Все, что вам действительно нужно, это очень простой алгоритм:

  • Читать строчку
  • Разделите это на слова
  • Запишите количество слов
  • Когда закончите, отобразите счет

Вот пример программы

#! /usr/bin/perl -w    
use strict;

my (%data);
while (<STDIN>) {
    chomp;
    my(@words) = split(/\s+/);
    foreach my $word (@words) {
        if (!defined($data{$word})) {
            $data{$word} = 0;
        }
        $data{$word}++;
    }
}

foreach (sort(keys(%data))) {
    print "$_: $data{$_}\n";
}

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

  • удалить не алфавитные символы из каждого слова
  • вывести три результата в каждой строке
  • использовать входные и выходные файлы
  • поместить алгоритм в подпрограмму

Я согласен, что начинать с ответа Дейва было бы более продуктивным, но если вас интересуют ваши ошибки, вот что я вижу:

  1. Вы присваиваете возвращаемое значение checkArgs скалярной переменной $checkArgs, но возвращаете значение массива. Это означает, что $ checkArgs всегда будет содержать 2 (размер массива) после этого вызова (потому что программа умирает, если число аргументов не равно 2). Это не очень плохо, так как вы не используете значение позже, но зачем вам оно вообще нужно в этом случае?

  2. Вы открываете файлы и закрываете их немедленно, не читая с них. Не имеет смысла.

  3. утверждение

    пока (<>)

читает либо из стандартного вывода, либо из всех файлов аргументов командной строки. Последний вариант похож на то, что вы хотите, но ваш второй аргумент - это выходной файл, а не входной. Оператор по алмазам тоже постарается почитать. У вас есть два варианта: a) использовать только одно имя файла в аргументах командной строки, прочитать файл с помощью <>, использовать стандартный вывод для вывода и перенаправить вывод в файл в оболочке; б) использовать

while(<$file1>)

вместо этого, конечно, перед закрытием файлов. Вариант а) является традиционным Unix- и Perl-стилем, но б) обеспечивает более понятный код для начинающих.

  1. Заявления

    вернуть $word;

а также

return $str, $hash{$str};

возвращать соответствующие значения на первых итерациях циклов, все остальные данные остаются необработанными. В первом случае вы должны создать локальный массив, сохранить в нем все $ word и вернуть массив целиком. Во втором случае у вас уже есть локальный% хеш, достаточно вернуть этот хеш. В обоих случаях вам нужно присваивать возвращаемые значения функций не скалярам, ​​а массиву и хешу соответственно. Теперь вы фактически потеряете все свои данные.

Другие вопросы по тегам