convertdic.pl

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