如何使用Perl regExp对句子进行计数?

| 我从一开始就出于某种原因一直在Perl中使用regExp挣扎,我在这里编写了一个快速脚本来对输入的某些文本中的句子进行计数,这是行不通的。我只是将数字1返回末尾,并且我知道在指定的文件中有几个,因此计数应该更高。我看不到这个问题...
#!C:\\strawberry\\perl\\bin\\perl.exe

#strict
#diagnostics
#warnings

$count = 0;
$file = \"c:/programs/lorem.txt\";

open(IN, \"<$file\") || die \"Sorry, the file failed to open: $!\";


while($line = <IN>)
{     
    if($line =~ m/^[A-Z]/)
    {
    $count++;
    }
}

close(IN);

print(\"Sentances count was: ($count)\");
文件lorem.txt在这里...... Lorem ipsum dolor坐下来,管教着迷。 Aenean commodo ligula eget dolor。艾妮·马萨(Aenean Massa)。兼收并蓄的蒙特产,无花果和无花果。 Donec quam felis,neculies nec,pellentesque eu,pretium quis,sem。 Nulla等于massa quis enim。 Donec pede justo,fringilla vel,aliquet nec,vulputate eget,arcu。在enim justo,rhocus ut,imperdiet a,venenatis vitae,justo中​​。 Nullam dictum felis eu pede mollis pretium。整数Tincidunt。 Cras dapibus。 Vivamus elementum semper nisi。埃内斯(Aenean)富足的eleifendtellus。 Aenean leo ligula,porttitor eu,consequat vitae,eleifend ac,enim。 Aliquam lorem ante,dapibus,viverra quis,feugiat a,tellus。菜豆(Phasellus viverra nulla ut metus varius laoreet)。 Quisque rutrum。艾妮(Aenean)卑鄙。 Etiam ultricies nisi vel augue。 Curabitur ullamcorper菌类。 Nam eget dui。阿提姆龙鼻。雌性颞叶色菊,特鲁斯获得调味品的菱形,sem quam semper libero,坐着的sem neque sed ipsum。 Nam quam nunc,Blandit vel,luctus pulvinar,hendrerit id,lorem。 Maecenas nec odio et ante tincidunt tempus。 Donec vitae sapien ut libero venenatis faucibus。 Nullam quis ante。 Etiam坐在amet orci eget eros faucibus tincidunt。 Duis leo。塞德·贝宁·毛里斯(Sed fringilla mauris) Donec sodales矢状象。 sed consequat,leo eget bibendum sodales,augue velit cursus nunc,     
已邀请:
我不知道您的ѭ1中有什么,但是您提供的代码没有计算句子。它是计数行,此外,它是计数以大写字母开头的行。 此正则表达式:
/^[A-Z]/
仅在该行的开头且该行的第一个字符大写时才匹配。因此,如果您的行看起来像
it. And then we went...
,它将不会被匹配。 如果要匹配所有大写字母,只需从正则表达式的开头删除
^
。     
这不能回答有关regexp的特定问题,但是您可以考虑使用CPAN模块:Text :: Sentence。您可以查看其源代码以了解其如何定义句子。
use warnings;
use strict;
use Data::Dumper;
use Text::Sentence qw(split_sentences);

my $text = <<EOF;
One sentence.  Here is another.
And yet another.
EOF

my @sentences = split_sentences($text);
print Dumper(\\@sentences);

__END__

$VAR1 = [
          \'One sentence.\',
          \'Here is another.\',
          \'And yet another.\'
        ];
谷歌搜索也出现了:Lingua :: EN :: Sentence     
您目前正在计算所有以大写字母开头的行。也许您打算计算以大写字母开头的所有单词?如果是这样,请尝试: m / \\ W [A-Z] / (尽管这不是句子的可靠计数) 另外,不需要显式地进行文件操作。 perl可以为您做得很好。尝试这个: $ ARGV [0] = \“ c:/programs/lorem.txt \”,除非@ARGV; while($ line = <>){ ... 如果您确实坚持要进行显式打开/关闭,则使用原始文件句柄被视为不好的做法。换句话说,而不是“打开我的...”,而是“打开我的$ fh,\'<\',$ file_name; \”     

要回复问题请先登录注册