【问题标题】:How can I count paragraphs in text file using Perl?如何使用 Perl 计算文本文件中的段落?
【发布时间】:2010-03-22 10:08:50
【问题描述】:

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

【问题讨论】:

  • 你能补充一些关于什么不起作用的信息吗?
  • 1) $c$C 是不同的变量。 2) 将use strict; use warnings; 添加到脚本顶部。
  • 这似乎计算了不是换行符的字符数。这可能不是段落的数量。根据“段落”是什么,您可能想要计算换行符,或者一个换行符跟随另一个换行符的次数。 (加上尤金指出的不同变量的事实......)
  • 教你在 Perl 中使用getc() 的人应该被枪毙。
  • 当然 $c 和 $C 不一样——这是我的错误。不起作用意味着它没有返回我理解的段落数量是由两个换行符分隔的文本块。

标签: perl file paragraphs


【解决方案1】:

perlfaq5: How can I read in a file by paragraphs?

local $/ = '';  # enable paragraph mode
open my $fh, '<', $file or die "can't open $file: $!";
1 while <$fh>;
my $count = $.;

【讨论】:

  • 本地 $/ = ''; (不会在小脚本中产生影响,但在更大的脚本中,您可能会扰乱其他模块对 $/ 的使用)
【解决方案2】:

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • eugene y 的答案更适合长文本 - 这个会咀嚼记忆
    • 我觉得我不应该指出这一点,但我怀疑内存消耗在普通 Perl 程序员的优先级列表中非常高。 ;-)
    猜你喜欢
    • 2017-08-14
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2014-02-28
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多