高手进,赐教!谢

高手进,赐教!谢

$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"函数的说明,上面的疑惑始终无法解决,请赐教!
------------此问题接"统计某字符的个数"帖发过了,估计是题目取的不好,对大家来说太简单了,没有吸引力,不能引起大家的注意吧.所以偶新开了一个帖子,见谅!^_^
$a="perl perlperlperl perl perl perl"

@array=split(/perl/,$a);

此时@array里有7个元素

foreach(@array){
不好意思按错了
foreach(@array){
        print "1$_";
}
输出看一下就明白了

里边的元素都是空和空格
try~~~

#!/usr/bin/perl -w
use strict;
my ($sum,$i)=(-2,0);
open(FILE,"a") || die("open error!");
while(<FILE>){
        while($sum!=-1){
                $sum=index($_,"perl",$sum+2);
                $i++    if($sum!=-1);
        }
}
print "$i\n";
我看了你原来的帖子了,你的结果如果是9是因为1+2+6,1是你自己首先定义了$i=1造成的
你用的是$#表示得到的数组元素最高标号,比如@arr[9]表示有10个element,$#arr --->>> 9
所以第一行,最后一个perl后面有句号,保留字符
第二行最后是'',就是空字符,删除
第一次@tmp有3个元素,第二次有7个,所以1+2+6=9
open (FILE,"e:/perl0/test.txt") or die "$!";
while(<FILE>){
my @tmp =split(/perl/i,$_);
print "$tmp[0]\n";
print "$tmp[1]\n";
print "$tmp[2]\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

输出结果为:
Learning
, better known as "the Llama book", starts the programmer on the way to mastery. Hello
,

没有看到处理字符串"perl perlperlperl perl perl perl"的结果啊!丢弃了吧?1+2+6,那这个6从何而来啊?
不是没看到,是你看不见

QUOTE:
# ### # #

这是你测试结果,如果你把#去掉(注意:最后#后面还有一个空格)
你看到是*_**___(注:_表示空格,*表示空字符,实际上应该打不出来)
你说这样的打印结果,要么就是空格,要么就是不打印,你能看到吗?
另说明:*和_是我说明替代的,请勿模仿。。

所谓舍弃空字符,是$temp=''这样的字符
第二部分本来是*_**___*,由于*表示空,所以舍弃
也就是说,这种方法往往得不到你想要的结果,split不合适,除非重新改
其实貌似原文中 scooyy 的方法可行的,只需要把if改成while即可
@fields = split /:/, “:::a:b:c:::”; #得到(“”, “”, “”, “a”, “b”, “c”);
我想弄明白一点:后面产生的3个空字符被丢弃了,这里"丢弃"的含义是指:
(1)运行结果末尾的空字符只是打印出来我们肉眼看不到,但本身是存在那3个空字符的?或
(2)程序运行结果到"c"就结束了,程序运行结果中根本不存在后面有3个空字符?
那么这里$#fields等于多少啊?
如果是(1)正确,那么$#fields=9.
如果是(2)正确,那么$#fields=6.
请老大指教啊,小弟愚昧,钻进牛角尖里去了.谢谢您!
要学会自己解决问题,写几行代码验证一下不就清楚了:
@fields = split /:/, ":::a:b:c:::";
$number=@fields; # 数组的个数
print "\nArray number===$number\n";
print "\n\$#fields===$#fields\n";