perl中怎么统计中、英文单词个数

【求助】perl中如何统计中、英文单词个数这个问题早就有人问过,原来的字符串是:asldkfj中华sdkfj人民sdlfkjs

【求助】perl中如何统计中、英文单词个数
这个问题早就有人问过,原来的字符串是:
asldkfj中华sdkfj人民sdl;fkjs共和dl;fj国sl;djf
那么应该返回4。
大牛们给出的做法是:

Perl code
my $s = 'dfsab准b好c,.aa123准哦难,。过';my $x = () = $s =~ /[\x00-\x7f]+?/g;my $y = () = $s =~ /[^\x00-\x7f]+?/g;my $z = () = $s =~ /[^\x00-\x7f]+/g;print "$x\n";#非中文字符的个数print "$y\n";#中文的字节数,除2就是中文个数print "$z\n";#不相连的中文字符串的个数

详见:
http://topic.csdn.net/u/20081028/15/5bfac54c-3e04-4ad7-a4df-a10fb1065554.html?seed=148127533&r=60434568#r_60434568

现在我碰到的问题是:
文本:“然而谁又知道BP机”,当将这句话放在perl代码中时,如:
Perl code
my $s = 然而谁又知道BP机';


和将其放在一个文本文件中,读入进来,如:
Perl code
Perl codeopen(my $fp, "<a.txt") or die "can't open file\n";my $s = <$fp>;chomp $s;close($fp);


得到的x,y,z的值分别为0,27,1和0,18,1。
我的困惑是:
1、不知道为什么会有这样的差异?
2、一个中文占三个字节么?上面代码中说“除以2就是中文字数”
3、这里的B和P应该转换为全角了,没有检查出来,要怎么检查出来呢?
4、my $x = () = $s =~ /[\x00-\x7f]+?/g;这个表达式什么意思?一个标量等于一对括号,括号又等于一个正则表达式的返回值,而在正则表达式中+和?同时出现了,+表示匹配一到多次,?表示匹配0或一次。这个真没看懂。

不胜感激!


[解决办法]
1. 搞清楚你的问题。你到底是想统计非中文,还是简单的想统计英文?如果有日文呢?
2. 处理中文的时候不要使用\xc0这种gbk编码。像3楼那样使用unicode。一定要养成这种习惯。否则问题不断。比如你上面的那个尝试,从一开始就是行不通的。

再贴一段只抓英文和全角英文的代码:
Perl code
use strict;use warnings;use Encode;my $s = decode('gbk', 'bp, 然而谁又知道BP机');$s =~ s/[^a-zA-Z\N{U+ff41}-\N{U+ff5a}\N{U+ff21}-\N{U+ff3a}]//g;print encode('gbk', $s);