我试着按照 perl 代码来计算文件的中文单词,它似乎有效但没有得到正确的结果。非常感谢任何帮助。
错误信息是
Use of uninitialized value $valid in concatenation (.) or string at word_counting.pl line 21, <FILE> line 21.
Total things = 125, valid words =
在我看来问题是文件格式。 “总计”是 125,即字符串编号(125 行)。最奇怪的是我的控制台正确显示了所有单个中文单词,没有任何问题。 utf-8
pragma 已安装。
#!/usr/bin/perl -w
use strict;
use utf8;
use Encode qw(encode);
use Encode::HanExtra;
my $input_file = "sample_file.txt";
my ($total, $valid);
my %count;
open (FILE, "< $input_file") or die "Can't open $input_file: $!";
while (<FILE>) {
foreach (split) { #break $_ into words, assign each to $_ in turn
$total++;
next if /\W|^\d+/; #strange words skip the remainder of the loop
$valid++;
$count{$_}++; # count each separate word stored in a hash
## next comes here ##
}
}
print "Total things = $total, valid words = $valid\n";
foreach my $word (sort keys %count) {
print "$word \t was seen \t $count{$word} \t times.\n";
}
##---Data----
sample_file.txt
那天约二更时,只见封肃方回来,欢天喜地.众人忙问端的.他乃说道:"原来本府新升的太爷姓贾名化,本贯胡州人氏,曾与女婿旧日相交.方才在咱门前过去,因见娇杏那丫头买线, 所以他只当女婿移住于此.我一一将原故回明,那太爷倒伤感叹息了一回,又问外孙女儿,我说看灯丢了.太爷说:`不妨,我自使番役务必探访回来.'说了一回话, 临走倒送了我二两银子."甄家娘子听了,不免心中伤感.一宿无话.至次日, 早有雨村遣人送了两封银子,四匹锦缎,答谢甄家娘子,又寄一封密书与封肃,转托问甄家娘子要那娇杏作二房. 封肃喜的屁滚尿流,巴不得去奉承,便在女儿前一力撺掇成了,乘夜只用一乘小轿,便把娇杏送进去了.雨村欢喜,自不必说,乃封百金赠封肃, 外谢甄家娘子许多物事,令其好生养赡,以待寻访女儿下落.封肃回家无话.
最佳答案
我们将 STDOUT 设置为 :utf8 IO layer所以说不会显示格式错误的数据,然后用同一层打开文件,这样菱形就不会读取格式错误的数据。 之后,在 while 内,我们没有在空字符串上拆分,而是使用带有 "East_Asian_Width: Wide" Unicode-like property 的正则表达式。 .
utf8 用于我个人的健全性检查,可以删除(Y)。
use strict;
use warnings;
use 5.010;
use utf8;
use autodie;
binmode(STDOUT, ':utf8');
open my $fh, '<:utf8', 'sample_file.txt';
my ($total, $valid);
my %count;
while (<$fh>) {
$total += length;
for (/(\p{Ea=W})/g) {
$valid++;
$count{$_}++;
}
}
say "Total things = $total, valid words = $valid";
for my $word (sort keys %count) {
say "$word \t was seen \t $count{$word} \t times.";
}
编辑:J-16 SDiZ 和 daxim 指出 sample_file.txt
在 UTF-8 中的可能性很小。阅读他们的评论,然后查看 Encode module在 perldoc 中,特别是“通过 PerlIO 编码”部分。
关于regex - 如何在 perl 中使用正则表达式计算文件中的中文单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4611425/