Обработка каждого слова в файле

Проблема

Требуется выполнить некоторую операцию с каждым словом файла, по аналогии с функцией 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



2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: