Как определить, сколько раз слово появляется в тексте? - PullRequest
0 голосов
/ 15 марта 2011

Как узнать, сколько раз слово находится в блоке текста в Perl?

Например, мой текстовый файл такой:

#! /usr/bin/perl -w
# The 'terrible' program - a poorly formatted 'oddeven'.
use constant HOWMANY => 4; $count = 0;
while ( $count < HOWMANY ) {
  $count++;
  if ( $count == 1 ) {
    print "odd\n"; 
  } elsif ( $count == 2 ) { 
    print "even\n";
  } elsif ( $count == 3 ) {
    print "odd\n";
  } else { # at this point $count is four.
    print "even\n";
  }
}  

Я хочу найтиномер слова «количество» для этого текстового файла.Файл называется terrible.pl

В идеале он должен использовать регулярное выражение и с минимальным числом строк кода.

РЕДАКТИРОВАТЬ: Вот что я пробовал:

use IO::File;
my $fh = IO::File->new('terrible.pl', 'r') or die "$!\n";
my %words;
while (<$fh>) {
  for my $word ($text =~ /count/g) {
  print "x";
    $words{$word}++;
  }
}
print $words{$word};

Ответы [ 6 ]

6 голосов
/ 16 марта 2011

Вот полное решение.Если это домашнее задание, вы узнаете больше, объяснив это своему учителю, чем бросив свое собственное:

perl -0777ne "print+(@@=/count/g)+0" terrible.pl
1 голос
/ 16 марта 2011

Если вы пытаетесь посчитать, сколько раз появляется слово «считать», это сработает:

my $count=0;
open(INPUT,"<terrible.pl");
while (<INPUT>) {
    $count++ while ($_ =~ /count/g);
}
close(INPUT);
print "$count times\n";
0 голосов
/ 16 марта 2011

Итак, что вы пытаетесь сделать? Вы хотите, чтобы число раз что-то появлялось в блоке текста. Вы можете использовать функцию Perl grep . Это будет проходить через блок текста без необходимости зацикливаться.

Если вам нужно нечетное / четное возвращаемое значение, вы можете использовать арифметическую функцию по модулю . Вы можете сделать что-то вроде этого:

if ($number % 2) {
   print "$number is odd\n"; #Returns a "1" or true
}
else {
   print "$number is even\n";  #Returns a "0" or false
}
0 голосов
/ 16 марта 2011

Perdoc Perlrequick имеет ответ.В этом документе вы хотите использовать термин «скалярный контекст».

Учитывая, что это, кажется, домашний вопрос, я вместо этого укажу на документацию.

0 голосов
/ 15 марта 2011

Вы, вероятно, можете использовать что-то вроде этого:

my $fh = IO::File->new('test.txt', 'r') or die "$!\n";
my %words;
while (<$fh>) {
  for my $word (split / /) {
    $words{$word}++;
  }
}

Это даст вам точное количество каждого «слова» (определяемого как группа символов, разделенных пробелом), и сохранит его в хеше, который набирается словом со значением номера слова, которое был замечен.

0 голосов
/ 15 марта 2011

Я не совсем уверен, какой у вас пример кода, но вы почти у цели:

perl -e '$ text = "lol wut foo wut bar wut";$ count = 0;$ count ++ while $ text = ~ / wut / g;print "$ count \ n"; '

Вы можете использовать модификатор / g, чтобы продолжить поиск совпадений в строке.В приведенном выше примере он вернет все экземпляры слова 'wut' в переменной $ text.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...