请教"某字符在文章中出现的次数"

只知道结果不知道为什么一起等答案
在糍粑兄弟的帮助下,得到一个新的程序:

$i=1; #本程序实现:在文章中统计某字符的个数
open (FILE,"e:/perl0/test.txt") or die "$!";
while(<FILE>)
{
  my @tmp =split(/perl/i,$_);
  $i+=$#tmp;  #关于$#请看小骆驼书《perl入门4》中第40页。
}
close FILE;
print "i=$i\n";

该程序能满足要求,但:
其中有一点偶感到疑惑:
假如e:/perl0/test.txt内容为:

Learning Perl, better known as "the Llama book", starts the programmer on the way to mastery. Hello perl,
perl perlperlperl perl perl perl

通过my @tmp =split(/perl/i,$_);我们知道test.txt中末尾一行perl perlperlperl perl perl perl将被忽略.因为
-----------------------------------------------------------------------
"这里有一条规则:开头的空元素会被返回,但结尾的空元素被丢弃"
-----------------------------------------------------------------------摘自<perl入门第4版>
所以应该只能得到$tmp[0],$tmp[1],$tmp[2].所以$#tmp最大也只是值2.那为什么程序中得到的字符"perl"的个数是9呢? #观点1
接着,
open (FILE,"e:/perl0/test.txt") or die "$!"; #程序实现:体会split(/perl/i,$_)这句。
while(<FILE>){
my @tmp =split(/perl/i,$_);
print join "#",@tmp;
}
运行结果为:
Learning #, better known as "the Llama book", starts the programmer on the way to mastery. Hello #,
# ### # #
此时很明显了,是存在$tmp[3],$tmp[4]等的. #观点2
观点1和观点2矛盾了...
我看了骆驼书"split"函数的说明,上面的疑惑始终无法解决,请赐教!
就在你说的<perl入门第4版>的"这里有一条规则:开头的空元素会被返回,但结尾的空元素被丢弃"这句话后面就是个例子,如下

[Copy to clipboard] [ - ]
CODE:
@fields = split /:/, ":::a:b:c:::";  # gives ("", "", "", "a", "b", "c")

换成你的
@tmp = split /perl/, 'perl perlperlperl perl perl perl'; # gives ("", " ", "", "", " ", " ", " ") 7 elements

兄弟没理解我的意思吧
@fields = split /:/, ":::a:b:c:::";  # gives ("", "", "", "a", "b", "c")
这里,并不是显示的("", "", "", "a", "b", "c","", "", "",)啊!后面的丢弃了.
-----------是的,这个毫无疑问.
同样,文本test.txt:
Learning Perl, better known as "the Llama book", starts the programmer on the way to mastery. Hello perl,
perl perlperlperl perl perl perl
字符串"perl perlperlperl perl perl perl"在文本test.txt末尾啊,理应丢弃呀!
请帮解释,谢谢!
'perl perlperlperl perl perl perl'
1    2    3   4   5    6    7     8
这里第8个被丢弃了
于是$#tmp=6, 加上前面那行2, 以及初始值1, 就是你程序里的9了。

$i=0;
open (FILE,"e:/perl/test.txt") or die "$!";
while(<FILE>)
{
   $i++  while($_=~/perl/gi);
}
close(FILE);
print "i=$i\n";


原来是if,改成while,是因为if()判断后面是否为0,并执行前面代码,也就是只一次
而while是只要非0就执行一次,并循环



[Copy to clipboard] [ - ]
CODE:
use LWP::Simple qw(get);
$allweb=get("http://bbs.chinaunix.net/forumdisplay.php?fid=25");
@allperl=$allweb=~/(perl)/ig;
print scalar(@allperl);

看了您的程序,可以统计整个页面源码中所有"perl"字符的个数.
有没有什么方法只统计web上肉眼看的到的"perl"字符啊?
谢谢!
这样也可以
$\=undef;
open (FILE,"e:/perl/test.txt") or die "$!";
$context=<FILE>;
push(@tmp,$&) while($context=~/perl/gi);
close(FILE);
$\="\n";
print ($#tmp+1);
undef(@tmp);

#!/usr/bin/perl
$a = "perlperlperlperl";
$num= $a=~s/perl/perl/g;
print "$num\n";
也可以啦...

要过滤掉肉眼看不到的..可以用..
$line =~s/<.*?>//g;
剩下来的去做匹配..试试看吧....