按自定义汉字索引对日语词汇字段进行排序

时间:2018-07-22 01:33:49

标签: perl sorting cjk kanji

我一直在使用10年前创建的PERL程序,该程序输入日语文本(词汇表)和自定义的汉字索引(例如RTK或KKLC或2k1KO或Frequency),并根据该文本中出现的最大的汉字索引。这个想法是将使用汉字的单词放在索引列表的下方,然后将其放在词汇表的下方。最近几个月,随着对Strawberry的更新,该程序停止工作并输出以下错误:

  

在vec中使用未初始化的值$ mask   C:/Strawberry/perl/lib/warnings.pm第377行。未知的PerlIO层   kanji-sort-1.5.pl第8行的'encoding'未知PerlIO层“ encoding”   在C:/Strawberry/perl/lib/open.pm行120。未知的PerlIO层   在C:/Strawberry/perl/lib/open.pm第128行进行“编码”。未知的PerlIO   C:/Strawberry/perl/lib/open.pm第129行的“编码”层。   Vec中未初始化的值$ mask,位于C:/Strawberry/perl/lib/warnings.pm   行412。未初始化值$ mask在按位和(&)中的使用   C:/Strawberry/perl/lib/warnings.pm第424行。名称   “ Getopt :: Long :: CallBack :: OVERLOAD”仅使用一次:可能出现错字   C:/Strawberry/perl/lib/overload.pm第11行。未知的PerlIO层   在kanji-sort-1.5.pl第21行进行“编码”。   在kanji-sort-1.5.pl第22行上的文件句柄KANJI。

我可以做些什么使该程序再次运行吗?

这是程序。将词汇表分解为字符并为其赋予基于汉字的最高索引分数值似乎很简单。 :

#!/usr/bin/perl -w

# $ kanji-sort --kanji kanjiorder.txt --sentence-field 2 < mydeck-exported.txt > mydeck-toimport.txt
# $Revision: 1.5 $ $Date: 2010/01/08 08:22:33 $
# http://ichi2.net/anki/wiki/ContribFugounashi

use open qw( :std :encoding(UTF-8) );
use strict;
use Getopt::Long;
use utf8;

my $kanjifile;
my $sentence_field;
GetOptions(
    'sentence-field=i'=> \$sentence_field,
    'kanji=s' => \$kanjifile
);

my %kanji;
open KANJI, "<$kanjifile";
while(<KANJI>){
    chomp;
    $_=(split /\t/)[0];
    if(exists $kanji{$_}){
    print STDERR "$0: warning: ignoring duplicate kanji: $_: $kanjifile: $.\n";
    }else{
    $kanji{$_}=$.;
    }
}

my @max;
my @lines;
while(<>){
    chomp;
    my $i=$. - 1;
    $lines[$i]=$_;
    my $sentence=(split '\t', $_)[$sentence_field];
    my @chars = split //, $sentence;
    $max[$i]=0;
    foreach my $char (@chars){
    if(($kanji{$char}) && ($kanji{$char} > $max[$i])){
        $max[$i]=$kanji{$char};
    }
    }
}

my @index = 0 .. (@max - 1);
my @sorted = sort {$max[$a] <=> $max[$b]} @index;

my $last=0;
foreach my $i (@sorted){
    my $step=$max[$i] - $last;
    $last=$max[$i];
    my $sentence=(split '\t', $lines[$i])[$sentence_field];
    my @chars = split //, $sentence;
    print "$lines[$i]\t$max[$i]\t$step\n";
}

1 个答案:

答案 0 :(得分:0)

您的代码中没有语法错误。已在Strawberry Perl(Windows)和Linux上签入。修复您的perl安装。

在这里,您可以在不运行脚本的情况下检查语法:

perl -c test.pl