首页 > 解决方案 > 按自定义汉字索引对日语词汇字段进行排序

问题描述

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

在 C:/Strawberry/perl/lib/warnings.pm 第 377 行的 vec 中使用未初始化的值 $mask。在 kanji-sort-1.5.pl 第 8 行的未知 PerlIO 层“编码”在 C:/ 的未知 PerlIO 层“编码” Strawberry/perl/lib/open.pm 第 120 行。C:/Strawberry/perl/lib/open.pm 中的未知 PerlIO 层“编码”第 128 行。C:/Strawberry/perl/lib/ 中的未知 PerlIO 层“编码” open.pm 第 129 行。在 C:/Strawberry/perl/lib/warnings.pm 的 vec 中使用未初始化的值 $mask 第 412 行。在 C:/Strawberry/perl/ 中按位和 (&) 使用未初始化的值 $mask 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 上的 readline()。

我能做些什么来让这个程序再次运行吗?

这是程序。将词汇分解成字符并根据其中的最高索引分数给它们一个基于汉字的值似乎很简单。:

#!/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";
}

标签: perlsortingcjkkanji

解决方案


您的代码中没有语法错误。在 Strawberry Perl (Windows) 和 Linux 中检查。修复你的 perl 安装。

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

perl -c test.pl

推荐阅读