use strict;
use warnings;
#日本語ファイルを使うおまじない
use encoding 'utf8';
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
#-------------------------------------------------------------------------------
#引数を指定
if (@ARGV != 3) {
print "Usage: perl convertdic.pl guest host list\n";
exit(-1);
}
#-------------------------------------------------------------------------------
#置換リストを読み込む
open(LIST, $ARGV[2]) or die $! ;
my @hira; #リストの読みを格納
my @alpha; #リストの英字を格納
my $list_number; #リストの行数を格納。英字変換の条件に利用
while (my $list_line = <LIST>) {
chomp($list_line);
my @list_item = split(/\t/, $list_line); #1行を読みと英字に分割
push @hira, $list_item[0];
push @alpha, $list_item[1];
}
$list_number = @hira;
print "置換リストより $list_number 行を読み込みました。\n";
close(LIST);
#-------------------------------------------------------------------------------
#追加辞書の加工,,kakasi用追加辞書の作成
open(GUESTDIC, $ARGV[0]) or die $! ;
open(KAKASIDIC, ">>kakasidic.txt") or die $!;
my @newguest; #加工した追加辞書を格納
my @kakasi; #kakasi用追加辞書を格納
while (my $guest_line = <GUESTDIC>) {
chomp($guest_line);
my @guest_item = split(/\t/, $guest_line); #分割処理
$guest_item[0] =~ tr/A-Za-z0-9!”#$%&’()<>/.\x{3000}/A-Za-z0-9!\"\#$%&'\(\)\<\>\/\.\x{0020}/; #読みの全角→半角変換
$guest_item[1] =~ tr/A-Za-z0-9-!”#$%&’()<>/.\x{3000}/A-Za-z0-9\-!\"\#$%&'\(\)\<\>\/\.\x{0020}/; #変換候補の全角→半角変換
my $kakasi_line = "$guest_item[0] $guest_item[1]\n";
push @kakasi, $kakasi_line;
for(my $i = 0; $i < $list_number; $i++) { #読みを英字変換
$guest_item[0] =~ s/$hira[$i]/$alpha[$i]/g;
}
my $newguest_line = "$guest_item[0]\t$guest_item[1]\n";
push @newguest, $newguest_line;
}
@kakasi = sort(@kakasi); #kakasi用追加辞書をソート
my $kakasi_number = @kakasi;
print KAKASIDIC @kakasi; #KAKASIDICに出力
print "$kakasi_number 行のkakasi用追加辞書を作成しました。\n";
my $newguest_number = @newguest;
print "追加する辞書を $newguest_number 行加工しました。\n";
close(KAKASIDIC);
close(GUESTDIC);
#-------------------------------------------------------------------------------
#元の辞書の加工
#open(HOSTDIC, "<:encoding(euc-jp)", $ARGV[1]) or die $! ;
open(HOSTDIC, $ARGV[1]) or die $! ;
my @newhost; #加工した元辞書を格納
while (my $host_line = <HOSTDIC>) {
chomp($host_line);
my @host_item = split(/\t/, $host_line);
my $newhost_line = "$host_item[0]\t$host_item[1]\n";
push @newhost, $newhost_line;
}
my $newhost_number = @newhost;
print "元辞書を $newhost_number 行加工しました。\n";
close(HOSTDIC);
#-------------------------------------------------------------------------------
#元辞書と追加辞書を結合,処理して新しい辞書を作成
open(NEWDIC, ">>newdic.txt") or die $! ;
my @connectdic; #結合した辞書を格納
my @newdic; #処理した新しい辞書を格納
my $newdic_number; #新しい辞書の行数を格納
@connectdic = (@newhost, @newguest); #元辞書と追加辞書を結合
my %newdic_uniq; #ハッシュのキーを利用してuniq
foreach my $data (@connectdic) {
$newdic_uniq{$data} = 1;
}
@newdic = keys(%newdic_uniq);
@newdic = sort(@newdic); #新しい辞書をソート
$newdic_number = @newdic;
print "$newdic_number 行の新しい辞書を作成しました。\n";
print NEWDIC @newdic;
close(NEWDIC);
最終更新:2009年04月28日 20:21