计算单词""的出现次数。给我所有不同的答案

时间:2014-10-03 02:45:55

标签: perl

所以我有一个简单的脚本来从命令行读取文本文件,我想计算"" s的数量,但我已经得到了奇怪的数字。

    while(<>){
    $wordcount= split(/\bthe\b/, $_);}
    print "\"the\" occurs $wordcount times in $ARGV";

所以使用它我会得到10次,但是如果我使用/ \ b,\ b / i我得到12. / \ Bthe \ b /给我6我相信。我的测试txt中有11次出现。我只是个白痴? $ wordcount应该从1还是0开始?以这种方式使用拆分也是不好的做法吗?该代码适用于实际计算单词,但在计算精确字符串时不行。新的perl所以任何和所有滥用都是值得赞赏的。感谢

编辑:我也知道它没有添加,但现在我知道$ wordcount被视为更像一个数组,所以它适用于前一次迭代,虽然它绝对是糟糕的形式。

5 个答案:

答案 0 :(得分:3)

在列表上下文中使用正则表达式来提取匹配次数:

my $wordcount = 0;

while (<>) {
    $wordcount += () = /\bthe\b/g;
}

print qq{"the" occurs $wordcount times in $ARGV\n};

参考:perlfaq4 - How can I count the number of occurrences of a substring within a string?

答案 1 :(得分:2)

split根据提供的正则表达式将字符串拆分为一个列表。您的计数来自于您将split置于标量上下文中的事实。来自perldoc -f split

 split   Splits the string EXPR into a list of strings and returns the
         list in list context, or the size of the list in scalar context.

鉴于字符串“快速的棕色狐狸跳过懒狗”,我希望你的$wordcount为2,这是正确的。

The quick brown fox jumps over the lazy dog
^^^============================^^^=========  -> two fields

然而,如果你有“一只鸟,快速的棕色狐狸跳过懒狗”你最终会得到3,这是不正确的。

A bird and the quick brown fox jumps over the lazy dog
===========^^^============================^^^========= -> three fields

首先,你绝对希望\b与词边界匹配。 \B匹配不是单词边界的内容,因此您将匹配包含“the”而不是单词“the”的任何单词。

其次你只想计算出现次数 - 你通过计算整个字符串的匹配来做到这一点

$wordcount = () = $string =~ /\bthe\b/gi

$wordcount成为标量上下文中的列表,()是您实际上未捕获的列表,因为您不想要匹配。 $string是要匹配的字符串。您在字边界处匹配“the”,gi是整个字符串(全局),不区分大小写。

答案 2 :(得分:1)

使用/ i标志,&#39;&#39;将被包括在内,但并非没有它。

\ B是一个字边界,所以只能找到&#34;衣服&#34;和&#34;&#34;&#34 ;

是的,以这种方式使用拆分是不好的做法。如果你只想要一个计数,请执行以下操作:

$wordcount = () = split ...;
在标量上下文中的分裂做了一些原本似乎是个好主意的东西,但是它不再那么好了,所以要避免它。上面的咒语在列表上下文中调用它,但是将找到的元素数量分配给$ wordcount。

但是the拆分所产生的元素并不是你想要的;你想要找到the的次数。那样做(可能使用/ ig而不仅仅是/ g):

$wordcount = () = /\bthe\b/g;

请注意,您可能希望+ =,而不是=,以获得所有行的总计。

答案 3 :(得分:0)

sample.txt

Ajith
kumar
Ajith
my name is Ajith and Ajith
lastname is kumar

<强>码

use Data::Dumper;

print "Enter your string = ";
my $input = <>; ## User input
chomp $input; ## The chomp() function will remove (usually) any newline character from the end of a string

my %count;
open FILE, "<sample.txt" or die $!; ## To read the data from a file
my @data = <FILE>;

for my $d (@data) {
    my @array = split ('\s', $d); ##To split the more than one word in a line
    for my $a (@array) {
        $count{$a}++;     ## Counter
    }
}

print Dumper "Result: " . $count{$input};

上面的代码获取输入vai命令提示符,然后将单词搜索到给定的文本文件“ sample.txt ”,然后显示输出在文本文件中出现的次数(样本) .txt)的

注意:用户输入必须为“区分大小写”。

来自USER的INTPUT

Enter your string = Ajith

<强>输出

$VAR1 = 'Result: 4';

答案 4 :(得分:0)

print "Enter the string: ";
chomp($string = <>);
die "Error opening file" unless(open(fil,"filename.txt"));
my @file = <fil>;
my @mt;
foreach (@file){
@s = map split,$_;
push(@mt,@s);
}
$s = grep {m/$string/gi} @mt;
print "Total no., of $string is:: $s\n";

在这里给出你期望的输出。