#!/usr/bin/perl -w # keywordlistをハッシュしてdump_storableファイルに吐き出す # Storableモジュールが必要(CPANにあるがPerl5.8以降は標準モジュール) use strict; use Storable; main(); sub main{ my $hash = {}; open(DATA,'keywordlist') or die $!; my $line = ; close(DATA); while( $line =~ /(((\\\|)|.)+?)(?:\||$)/g ){ my $word = lc($1); last if(length $word <= 2); # 鬱陶しいので2バイト以下のワードは無視 input_hash( $hash, \$word, (split//,$word) ); } store \$hash, 'dump_storable'; } # # IN : hashref, word_ref, array of chars # sub input_hash{ my ($hash,$word_ref,@chars) = @_; if(@chars){ my $letter = shift @chars; # 1バイト取得 my $code = ord($letter); # http://d.hatena.ne.jp/uno/20040222#p3 を参考にしました my $clen = ($code < 0x80) ? 1 : ($code == 0x8f ? 3 : 2); if($letter eq '\\'){ my $char = shift @chars; $letter = ($char ne 's') ? $char : ' '; } $letter .= shift @chars while(--$clen); # 正しい一文字に if(@chars){ $hash->{$letter} = {} if(!defined $hash->{$letter}); die "dobule" if( !(ref $hash->{$letter}) ); input_hash($hash->{$letter},$word_ref,@chars); } else{ if(defined $hash->{$letter}){ # すでにその場所が使われているなら my $temp = $hash->{$letter}; # 単語を退避してから配列に変更し、 $hash->{$letter} = []; # (hashref,単語) のリストを代入 push @{$hash->{$letter}},($temp,$$word_ref); } else{ $hash->{$letter} = $$word_ref; } } } }