Обработка каждого слова в файле
Проблема
Требуется выполнить некоторую операцию с каждым словом файла, по аналогии с функцией fоreach.
Решение
Разделите каждую строку по пропускам с помощью функции split:
while (<>) {
for $chunk (split) {
# Сделать что-то с $chunk
}
}
Или воспользуйтесь оператором m//g для последовательного извлечения фрагментов строки:
while (<>) {
while ( /(\w[\w'-]*)/g ) {
# Сделать что-то с $1
}
}
Комментарий
Сначала необходимо решить, что же подразумевается под «словом». Иногда это любые последовательности
символов, кроме пропусков; иногда — идентификаторы программ, а иногда — слова английского языка.
От определения зависит и используемое регулярное выражение.
Два варианта решения, приведенные выше, работают по-разному. В первом варианте шаблон определяет,
что не является словом. Во втором варианте все наоборот — шаблон решает, что им является.
На основе этой методики нетрудно подсчитать относительные частоты всех слов в файле. Количество
экземпляров каждого слова сохраняется в хэше:
# Подсчет экземпляров слов в файле
%seen = ();
while (<>) {
while ( /(\w['\w-]*)/g ) {
$seen{lc $1}++;
}
}
# Отсортировать выходной хэш по убыванию значений
foreach $word ( sort { $seen{$b} <=> $seen{$a} } keys %seen) {
printf "%5d %s\n", $seen{$word}, $word;
}
Чтобы программа подсчитывала количество строк вместо слов, уберите второй цикл while и
замените его на $seen{lc $_}++:
# Подсчет экземпляров строк в файле
%seen = ();
while (<>) {
$seen{lc $_}++;
}
foreach $line ( sort { $seen{$b) <=> $seen{$a} } keys %seen ) {
printf "%5d %s", $seen{$line}, $line;
}
В случае использования национальных алфавитов вам придется включить в программу директиву
use locale и использовать метасимвол \w в текущем локальном контексте.
См. такжеОписание функции split
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|