Как я могу считать абзацы в текстовом файле, используя Perl? - PullRequest
0 голосов
/ 14 марта 2010

Мне нужно создать Perl-код, который позволяет считать абзацы в текстовых файлах. Я попробовал это и не работает:

open(READFILE, "<$filename")
or die "could not open file \"$filename\":$!";

$paragraphs = 0;

my($c);

while($c = getc(READFILE))
{
if($C ne"\n")
{
$paragraphs++;
}
}

close(READFILE);

print("Paragraphs: $paragraphs\n");

Ответы [ 3 ]

6 голосов
/ 14 марта 2010

См. perlfaq5: Как я могу прочитать в файле по абзацам?

local $/ = '';  # enable paragraph mode
open my $fh, '<', $file or die "can't open $file: $!";
1 while <$fh>;
my $count = $.;
1 голос
/ 14 марта 2010

Взгляните на книгу Beginning Perl по адресу http://www.perl.org/books/beginning-perl/. В частности, вам поможет следующая глава: http://docs.google.com/viewer?url=http%3A%2F%2Fblob.perl.org%2Fbooks%2Fbeginning-perl%2F3145_Chap06.pdf

0 голосов
/ 14 марта 2010

Если вы определяете абзацы двойным переводом строки ("\ n \ n"), тогда это будет сделано:

open READFILE, "<$filename"
    or die "cannot open file `$filename' for reading: $!";
my @paragraphs;
{local $/; @paragraphs = split "\n\n", <READFILE>} # slurp-split
my $num_paragraphs = scalar @paragraphs;
__END__

В противном случае просто измените "\ n \ n" в коде, чтобы использовать собственный разделитель абзацев. Это может быть даже хорошая идея использовать шаблон \n{2,}, на тот случай, если кто-то сошел с ума от клавиши ввода.

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

my $num_paragraphs;
{local $/; $num_paragraphs = @{[ <READFILE> =~ /\n\n/g ]} + 1}

Хотя, если вы хотите продолжать использовать свой собственный код, вы можете изменить if($C ne"\n") на if($c eq "\n").

...