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


Автор: walan 10.3.2008, 23:28
Проблема в следующем:
Есть фаил "stix.txt"

 в нем написан стих

как на PERL написать скрипт что бы подсчитал все слова и буквы в нем?

Автор: Itsys 10.3.2008, 23:44
Код

open (F, "<stix.txt");
$text = join(" ",<F>);
$slova = scalar(split(/ /, $text));
$text =~ s/ //g;
$bukvi = scalar(split//, $text);


Помоему так должно сработать, не проверял

Автор: walan 11.3.2008, 00:04
Itsys 

забыл довавить, что бы и вывести эти данные на экран
представить сколько всего слов и всех букв в файле, вот (

Автор: shamber 11.3.2008, 10:15
walan, начните наверно с раздела http://forum.vingrad.ru/forum/topic-1167.html и почитайте документацию.
Если вы не знаете как использовать функцию print это вам очень поможет.

Автор: amg 11.3.2008, 14:44
Цитата(walan @  11.3.2008,  00:04 Найти цитируемый пост)
вывести эти данные на экран
Код

perl -ln0e "s/^\s+//; s/\s*$/ /; print 'words ',s/\s+//g, ', letters ',length" stix.txt

ЗЫ walan, прислушайтесь к совету shamber'а

Автор: ginnie 11.3.2008, 17:52
Уважаемый amg, вроде знаки препинания буквами не считаются, кроме того, может быть и такой текст
Код

Хлеб - всему голова!

Автор: walan 11.3.2008, 18:47
Цитата(amg @ 11.3.2008,  14:44)
Цитата(walan @  11.3.2008,  00:04 Найти цитируемый пост)
вывести эти данные на экран
Код

perl -ln0e "s/^\s+//; s/\s*$/ /; print 'words ',s/\s+//g, ', letters ',length" stix.txt

ЗЫ walan, прислушайтесь к совету shamber'а

простите:
в жизни, ниразу ни чего подобного не видел
какая-то не разбериха, можно пояснить

текст

Автор: ginnie 11.3.2008, 18:56
Уважаемый Itsys,

Код

$slova = split(/ /, $text);


split() вызывается в скалярном контексте, поэтому явно указывать скалярный контекст при помощи scalar не нужно.

Автор: Itsys 11.3.2008, 22:24
ginnie, Привычка...  smile сути же не меняет

Автор: amg 12.3.2008, 13:25
Цитата(ginnie @  11.3.2008,  17:52 Найти цитируемый пост)
знаки препинания буквами не считаются, кроме того, может быть и такой текст: Хлеб - всему голова!
Справедливо! Наверное, будет немного лучше, если заменить в коде все \s на \W. Вообще, много зависит от того, что понимать под буквой (и словом). Пусть для простоты буквой будет \w

Цитата(walan @  11.3.2008,  18:47 Найти цитируемый пост)
какая-то не разбериха, можно пояснить
Код

die "Usage: $0 stix.txt\n" unless @ARGV; # help
use locale;    # Чтобы в \W не попадали русские буквы
local $/;      # Чтобы зачитать файл целиком
$_ = <>;       #  за одну операцию чтения в переменную $_
# $_ по умолчанию подставляется во многие функции (s///, length)
s/^\W+//;      # Удаляем "небуквы" вначале (в переменной $_)
s/\s*$/ /;     # Гарантируем пробел в конце
$w = s/\W+//g; # Удаляем промежутки между словами, запоминаем их кол-во
$l = length;   # В $_ теперь сплошной текст, запоминаем его длину
print "words $w, letters $l\n"; # Печатаем результат


Автор: Itsys 12.3.2008, 13:37
Цитата(amg @  12.3.2008,  13:25 Найти цитируемый пост)
use locale;

В Windows не работает вот. smile 

Автор: amg 12.3.2008, 13:58
Цитата(Itsys @  12.3.2008,  13:37 Найти цитируемый пост)
В Windows не работает
Тогда можно вместо use locale; самому определить "небукву", например 
Код

$W = qr([^\w\xC0-\xFFёЁ]); # "небуква" для Windows (cp1251) и linux (KOI8-R)
$W = qr([\s[:punct:]]); # или как-нибудь так
 и в регулярных выражениях заменить \W на $W

Автор: shamber 12.3.2008, 14:56
Itsys, не совсем правы.

Код

use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "ru_RU.CP1251");


работает
....

Автор: shamber 12.3.2008, 15:13
... косяк инета

Автор: Itsys 12.3.2008, 15:59
Цитата(shamber @  12.3.2008,  14:56 Найти цитируемый пост)
use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "ru_RU.CP1251");


Не могу сказать однозначно, но помоему так я пробовал ругается на setlocale(LC_CTYPE, "ru_RU.CP1251"), говорит, что нет такой локали и все тут.

PS Хотя могу ошибаться, т.к. это было давно.. в самом начале моей карьеры... с тех пор больше не пробовал - пользуюсь способом указанным amg.

Автор: shamber 12.3.2008, 16:02
Itsys, я пробовал, работает smile

Автор: t00t00 18.3.2008, 01:33
Цитата(Itsys @ 10.3.2008,  23:44)
Код

open (F, "<stix.txt");
$text = join(" ",<F>);
$slova = scalar(split(/ /, $text));
$text =~ s/ //g;
$bukvi = scalar(split//, $text);


Помоему так должно сработать, не проверял

помоему так выглядит намного легче

Код

open(IN,"text.txt") || die "$!";
my $text=<IN>;
my $xcount=($text=~tr/[a-zA-Z0-9/[a-zA-Z0-9]/);
print $xcount;


Автор: amg 18.3.2008, 08:11
t00t00, Ваш код посчитает только количество букв (а надо и слов тоже), причем только английских (надо, очевидно, и русских) и только в 1-й строке файла (надо - во всем). Если все эти нюансы учесть, то, думаю, уже не будет выглядеть намного легче.

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