regex - 如何在 perl 中使用正则表达式计算文件中的中文单词?

标签 regex perl embedding cjk

我试着按照 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/

相关文章:

用于验证组织/公司编号的 c# 代码?

regex - Perl 正则表达式用于变量替换

go - 是否导出嵌入错误?

python - 在c++中嵌入python时导入tensorflow返回null

javascript - 正则表达式javascript插入空格

c# - 用于从字符串中删除特定 BBCode 的正则表达式

regex - 在可选 token 之间寻找匹配?

python - 修改文本文件

python - keras LSTM 获取隐藏状态(将句子序列转换为文档上下文向量)

Python正则表达式搜索