ハマっている「お菓子」を教えて!

以前解決済みとしたのですが、解決していないので
もう一度よろしくお願いします。

以下のプログラムは、xxx.txtの内容を例えば、
(1)ぁ→ァ
(2)シイ→シー
(3)オウ→オー
に変化させようというものです。

現在のところ、出力ファイルには何も変化していない
ファイルが出力されるだけです。
use encoding 'euc-jp';は5.8.4では通りますが、
5.8.7ではエラーとなってしまいます。
入力ファイルの文字コードはEUC、改行コードはLF。
このperlファイルも同じ文字、改行コードを用いて
います。
どのように書けばよいのか、よろしくお願いいたします。

open(IN, "xxx.txt");
open(OUT, "> ***.txt");
while($b=<IN>){
for($i=0; $i<=258; $i++){
if($b[$i] =~ /[ぁぃぅぇぉ]/){
$b[$i] =~ s/[ぁぃぅぇぉ]/[ァィゥェォ]/;
}
if($b[$i] =~ /[イシチニ]イ/){
$b[$i] =~ s/イ/ー/;
}
if($b[$i] =~ /[オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ]ウ/){
$b[$i] =~ s/ウ/ー/;
}
}
}
close(IN);
close(OUT);

A 回答 (5件)

>use encoding 'euc-jp';は5.8.4では通りますが、


>5.8.7ではエラーとなってしまいます。
私の環境は5.8.4なので、確認できないですが、
5.8.7でも使えると思いますが・・
use encoding "euc-jp";
open(IN, "<:encoding(euc-jp)", "in.txt");
open(OUT, ">:encoding(euc-jp)", "out.txt");
while($b=<IN>){
$b =~ tr/ぁぃぅぇぉ/ァィゥェォ/;
$b =~ s/([イシチニ])イ/$1ー/g;
$b =~ s/([オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ])ウ/$1ー/g;
print OUT $b;
}
close(IN);
close(OUT);

この回答への補足

私の環境だとuse encoding "euc-jp";の行で
エラーとなってしまいます。
エディタとして「Perlを始めよう」というもの、
パスはperl.exeのある、binファイルに通してあるのですが…。

補足日時:2005/10/11 00:05
    • good
    • 0
この回答へのお礼

名前を見てびっくりしました。
以前回答を頂いたBLUEPIXYさんですね。
本当にありがとうございます。
現状は補足のとおりです…。

お礼日時:2005/10/11 00:09

>化ける行の断片は、


>番+バン+2/0/0
>で+デ+61/0/0
>お待ち+オマチ+17/0/0
>の+ノ+71/0/0

use encoding 'euc-jp';
open(IN, "<:encoding(euc-jp)", "EUC.txt");
で読み込んでもエラーにはなりませんでした。
    • good
    • 0
この回答へのお礼

出来ました!! ありがとうございました.
元のファイルから違うファイルに移し変えたら出来ました.
そんなものですね….大変お世話になりました.
私としては20ポイント以上差し上げたい気持ちです.

>BLUEPIXY さんが間違うわけなし
結構有名な方なのですね.
私は質問の数が上回っていますが,BLUEPIXYさんを目指して頑張っていきます.

お礼日時:2005/10/12 12:21

>すぐの返答は大変うれしいです.


結局なんの解決にもなってないので申し訳ないです・・
>euc-jp "\xE5" does not map to Unicode at jisyo01_1.pl line 65, <IN> line 39.
は、入力ファイルを読み込んで、EUC-JPとして読み込み内部表現であるUnicodeに変換するルールが見つからなかったというようなメッセージです。
通常だったらEUCとして変であるとか
文字コードの領域が全て対応しているとは限らないので、
変換できない文字があるということです。
そういう場合には、入力やコードなどを全てUTF-8で処理するのが常道かと思いますが、
よろしければ試してみたいので、
化ける行の断片を補足していただけませんか?

あと、関係ないですが
>open(OUT, ">:encoding(euc-jp)","> kekka.txt");
の時には、
>open(OUT, ">:encoding(euc-jp)","kekka.txt");
でいいです。

この回答への補足

化ける行の断片は、
(jisyo01.txtの内容)
番+バン+2/0/0
で+デ+61/0/0
お待ち+オマチ+17/0/0
の+ノ+71/0/0
などです。

最終結果は
で+デ+61/0/0  [で]  D e
のようになります。

#スクリプト
open(IN,"phone.txt");
$j = 0;
while($a=<IN>){
chomp $a;
@list = split(/\+/, "$a");
$kana[$j] = "$list[0]";$yomi[$j] = "$list[1]";
$j++;
}
close(IN);

use encoding "euc-jp";
open(IN, "<:encoding(euc-jp)","jisyo01.txt");
open(OUT, ">:encoding(euc-jp)","> kekka.txt");
while($b=<IN>){
chomp $b;
@list2 = split(/\+/, "$b");
$b =~ tr/ぁぃぅぇぉ/ァィゥェォ/;
$b =~ s/([イシチニ])イ/$1ー/g;
$b =~ s/([オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ])ウ/$1ー/g;
for($i=0; $i<=258; $i++){
$list2[1] =~ s/$kana[$i]/$yomi[$i]/g;
}
print OUT "$b [$list2[0]]$list2[1]\n";
}
close(IN);
close(OUT);

use encoding "euc-jp";
open(IN, "<:encoding(euc-jp)","kekka.txt");
open(OUT, ">:encoding(euc-jp)","> kekka2.txt");
@lines = <IN>;
@sortedlines = sort @lines;
print "@sortedlines\n";
#print $sortedlines[0];
for($i=1; $i<=@sortedlines; $i++){
if($sortedlines[$i] =~ /\s:\s/){
$sortedlines[$i] =~ s/\s:\s/:/;
}
if($sortedlines[$i] ne $sortedlines[$i-1]){
print OUT $sortedlines[$i];
}
}

close(IN);
close(OUT);

use encoding "euc-jp";
require "jcode.pl";
open(IN, "<:encoding(euc-jp)","kekka2.txt");
open(OUT, ">:encoding(euc-jp)",">> 20k.htkdic");
@str = <IN>;
foreach $str(@str){
&jcode::convert(\$str, "euc");
}
close(IN);
print OUT @str;
close(OUT);

phone.txtの内容(50音の音が入っている)
ナ+n a
ニ+n i
ヌ+n u
ネ+n e
ノ+n o
ハ+h a
ヒ+h i
フ+f u
ヘ+h e
ホ+h o
など。

補足日時:2005/10/11 22:34
    • good
    • 0
この回答へのお礼

>結局なんの解決にもなってないので申し訳ないです・・。
なんて優しい方なのでしょう。本当にありがとうございます。(涙)
最後のリダイレクトのアドバイスもありがとうございます。

まだ質問ですが…。よろしくお願いいたします。

お礼日時:2005/10/11 22:42

>Can't locate encoding.pm in @INC


>(@INC contains: C:/Perl/lib C:/Perl/site/lib .)
は、encoding.pmが無いってことです。
5.8以降のマニュアルには、encodingの記載があるので、
削除されたかインストールがうまくいっていないのでは?
もしくは、そもそもバージョンが5.8未満であるとか

この回答への補足

その可能性が高いかもしれません.
インストールをやり直してみます.

ところで違う問題が出てきてしまいました.
もう一度お願いできますか….
スクリプトを走らせると,エラーメッセージが
出た後,出力ファイルにはかなや漢字が文字化け
した結果が出力されています.

もちろんuse encoding "euc-jp"はopenする前に
に必要なのでしょうが….
よろしくお願いいたします.

#変換処理
use encoding "euc-jp";
open(IN, "<:encoding(euc-jp)","jisyo01.txt.cha");
open(OUT, ">:encoding(euc-jp)","> kekka.txt");
while($b=<IN>){
chomp $b;
@list2 = split(/\+/, "$b");
$b =~ tr/ぁぃぅぇぉ/ァィゥェォ/;
$b =~ s/([イシチニ])イ/$1ー/g;
$b =~ s/([オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ])ウ/$1ー/g;
for($i=0; $i<=258; $i++){
$list2[1] =~ s/$kana[$i]/$yomi[$i]/g;#r駻 囁圦q繒灑*r r゜r r r qハzfqロqヌysuオ
}
print OUT "$b [$list2[0]]$list2[1]\n";
}
close(IN);
close(OUT);

#ソートと重複要素取り除く
use encoding "euc-jp";
open(IN, "<:encoding(euc-jp)","kekka.txt");
open(OUT, ">:encoding(euc-jp)","> kekka2.txt");
@lines = <IN>;
@sortedlines = sort @lines;
print "@sortedlines\n";
#print $sortedlines[0];
for($i=1; $i<=@sortedlines; $i++){
if($sortedlines[$i] =~ /\s:\s/){
$sortedlines[$i] =~ s/\s:\s/:/;
}
if($sortedlines[$i] ne $sortedlines[$i-1]){
print OUT $sortedlines[$i];
}
}

close(IN);
close(OUT);

#ファイルに出力
require "jcode.pl";
open(IN, "kekka2.txt");
open(OUT, "> 20k.htkdic");
@str = <IN>;
foreach $str(@str){
&jcode::convert(\$str, "euc");
}
close(IN);
print OUT @str;
close(OUT);

エラーメッセージ
euc-jp "\xE5" does not map to Unicode at jisyo01_1.pl line 65, <IN> line 39.
euc-jp "\xA1" does not map to Unicode at jisyo01_1.pl line 35, <IN> line 94.
このようなものが何行も続く.

補足日時:2005/10/11 12:14
    • good
    • 0
この回答へのお礼

BLUEPIXYさん.すぐの返答ありがとうございます.
質問をしても返答が帰ってこない場合を経験しているので,
すぐの返答は大変うれしいです.
補足が長くなってしまいましたが,文字が正常に出力されません….
どのようにしたらよいのかわかりましたらよろしくお願いいたします.

お礼日時:2005/10/11 12:38

>私の環境だとuse encoding "euc-jp";の行で


5.8.7にアップデートしてみましたが、
#1のスクリプトで問題有りませんでした。
INのファイル及びスクリプトが本当にEUCになってますか?
エラーメッセージはどのようにでていますか

この回答への補足

INファイル及びスクリプトはEUCになっています。
エラーメッセージは、
Can't locate encoding.pm in @INC
(@INC contains: C:/Perl/lib C:/Perl/site/lib .)
at jisyo01_1.pl line 14.
となっています。

補足日時:2005/10/11 07:24
    • good
    • 0
この回答へのお礼

すぐの返答ありがとうございます。
またの質問になりますがよろしくお願いいたします。

お礼日時:2005/10/11 07:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!