所以我有一个简单的脚本来从命令行读取文本文件,我想计算"" 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被视为更像一个数组,所以它适用于前一次迭代,虽然它绝对是糟糕的形式。
答案 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";
在这里给出你期望的输出。