Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Число повторений слова в тексте


Автор: marowak 27.6.2011, 21:51
Я новичок в Perl, прошу помочь с решением несложной задачи, если возможно хотелось бы с использование for, while для более лёгкого понимания, ну и другим вариантам я естественно буду рад. 
Требуется подсчитать сколько раз встречается слово например "user" в файле "file.txt" содержимое файла типо "авраподдвыппррп user влп user овлала". 

Автор: Pfailed 28.6.2011, 07:24
Примерно так
Код

while (<FH>) {
    $cnt += () = /\buser\b/g;
}


Автор: arto 28.6.2011, 07:30
perl -lne 'BEGIN{ $a = shift } foreach (split "\\W+") { $h{$_}++ } END{ print $h{$a} }' user file

Автор: afiskon 28.6.2011, 08:45
Правильно это задача решается с помощью регулярных выражений. Если вы только учите язык, для вас это будет сложновато. Лучше начните http://eax.me/perl-basics/ и задач попроще, типа посчитать число строк в файле, вывести содержимое файла в обратном/случайном порядке, какое-нибудь простое шифрование-дешифрование.

Автор: dixoNICH 28.6.2011, 09:57
Код

$file = "1.txt";
$/=\0;
open FILE, "$file";
$_ = <FILE>;
$i = 0;
$i++ while(/\buser\b/g);

Автор: arto 28.6.2011, 10:07
$/=\0; -- это к чему?

Добавлено через 5 минут и 55 секунд
а, понял

Автор: marowak 28.6.2011, 17:12
спасибо всем! помогли

Автор: SkoobyDoo 30.6.2011, 06:30
Цитата(dixoNICH @ 28.6.2011,  12:57)
Код

$file = "1.txt";
$/=\0;
open FILE, "$file";
$_ = <FILE>;
$i = 0;
$i++ while(/\buser\b/g);
а я не понял :( можно пояснить 
Код

$/ = \0;

Автор: Pfailed 30.6.2011, 07:32
Цитата(SkoobyDoo @ 30.6.2011,  06:30)
Цитата(dixoNICH @ 28.6.2011,  12:57)
Код

$file = "1.txt";
$/=\0;
open FILE, "$file";
$_ = <FILE>;
$i = 0;
$i++ while(/\buser\b/g);
а я не понял :( можно пояснить 
Код

$/ = \0;

Автор кода хотел с помощью оператора <> считать весь файл за 1 раз. Обычно этот оператор читает по одной строке в скалярном контексте, а строго говоря читает пока не встретит разделитель указанный в специальной переменной $/. По умолчанию это перенос строки. У меня есть подозрение, что автор хотел написать $/ = "\0", действительно нулевой байт в текстовом файле встретиться не должен и весь файл считается за раз. Однако забыв кавычки получилась ссылка на число ноль и разделителем стало нечто вроде SCALAR(0x1041968). Конечно вероятность встретить такое в обычном тексте стремится к нулю, но все же это потенциальная ошибка.
Короче говоря, правильным вариантом будет $/ = undef, это позволит за 1 раз считать любой файл целиком.

Автор: SkoobyDoo 30.6.2011, 07:40
Pfailed, благодарю!

Автор: arto 30.6.2011, 08:15
несколько не так:

# perldoc perlvar | less -p INPUT_RECORD_SEPARATOR
...
Setting $/ to a reference to an integer, scalar containing an
               integer, or scalar that's convertible to an integer will
               attempt to read records instead of lines, with the maximum
               record size being the referenced integer.
...
Trying to set the record size to zero or less will
               cause reading in the (rest of the) whole file.

Автор: Pfailed 30.6.2011, 08:25
Ожидаемый подвох  smile 

Автор: dixoNICH 30.6.2011, 23:54
сбоя ни разу не было smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)