0

我需要创建允许对文本文件中的段落进行计数的 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");
4

3 回答 3

7

请参阅perlfaq5:如何按段落读取文件?

local $/ = '';  # enable paragraph mode
open my $fh, '<', $file or die "can't open $file: $!";
1 while <$fh>;
my $count = $.;
于 2010-03-14T19:23:03.020 回答
1

查看位于http://www.perl.org/books/beginning-perl/的“Beginning Perl”一书。特别是,以下章节将对您有所帮助:http ://docs.google.com/viewer?url=http%3A%2F%2Fblob.perl.org%2Fbooks%2Fbeginning-perl%2F3145_Chap06.pdf

于 2010-03-14T19:20:54.760 回答
-1

如果您通过双换行符 ("\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").

于 2010-03-14T19:24:46.983 回答