なにからなにまでてけとーです。


by 言壺

【困。】Perlで置換ができません。

置換をもっと楽にしたいなーと思いActivePerl(バージョン5.8.7)を職場のWin2000sp4マシンにインストールして正規表現を使った方法をいろいろ試していたのですが…動作しないのです。

べんきょし始めのころ(1ヶ月ぐらい前?)はたしかに動いていたのですが、
今、同じものを動かしてもさっぱり置換しなくなってしまいました。

試しているのはこの↓程度。
    while(<>){
    s/△/▼/g;
    print;
    }

なにがいけないんでしょか。そもそも根本的になんか間違えてますか…?

慣れてきた頃に大量のデータをやってみようとしたら、見事動かず。
あれー?と試行錯誤するうちに、全く置換してくれなくなりました。
動作…はするんだけど、出力結果を見ても全く反映していない。
仕事が楽になるはずが…あぁぁ。

エディタはEmEditorを使用、EUC形式で保存し、それをコマンドプロンプトから実行。
そういや前にいた人(秀丸使用)も「Perl、動かないんだよ…」と言っていた気がしてきた。
(で、結局Rubyで作っていた気が。)

どうしたらいいんだろう…教えて!えらいひと!(泣)

※正規表現・Perlとも、めさ初心者です。
[PR]
Commented by GALANT's Cafe at 2005-09-29 09:34 x
まずは...

Perlそのものが生きています?
インストールした時の環境変数とか、生きてます?
#特にPATHのあたり。

まずは、
perl -v
というコマンドを入れて、メッセージが出てきます?
Commented by ことつぼ。 at 2005-09-29 10:34 x
>GALANT's Cafeさん
へっぽこ文章にレスありがとうございます。
pael自体は生きています。(perl -vコマンドで確認済み)
環境変数は作成していません。つくる必要有りですか?(←このあたりは不勉強です)

同マシンにRubyも入っており、それをインストールしたときに同僚に言われるがまま
環境変数を新規で作成したのは覚えているのですが…。
Commented by xiaoxia at 2005-09-30 14:36
私だったら、まずプログラム内部が悪いのか、perlが悪いのか切り分けるために、「print "hello, world!";」だけを書いたプログラムを動かしてみますかね。
これで動いたら、プログラムが悪いってことで。
次に、プログラムの確認のために、コマンドラインでデバッガ(perldb)が動けば、1行ずつ試してみます。これでデバッガ自体が動かなければ、perl内部でperlモジュールを探すパスが消えちゃっている可能性が高いように思います。その際は再インストールですかね。
で、perlでeuc1文字の置換はこのままではキケンではないでしょうか。文字と文字の間(2バイト目+1バイト目の並び)にマッチしちゃうことがあって、全部化けてしまうようなきがしますが。
どでしょか。もう解決されたでしょうか。
Commented by kototubo at 2005-10-01 01:45
>霞さん 
おかしな文章にレスをありがとうございます。
「print "hello, world!";」は動作しました。
「マンドラインでデバッガ(perldb)」は…す、すみません、理解できていません。
「perlでeuc1文字の置換」も理解できてません。

もしかしたらなのですが、1バイト文字を置換しているうちは動作していたかもです。
実際にやりたい2バイト文字の置換は全く動作していない気がしています。
えー…と。検証不足です。
解決への道は遠そうです。(だめじゃん!)
Commented by GALANT's Cafe at 2005-10-01 09:45 x
ん~。
そのプログラムが過去に動いていたことを考えると、xiaoxiaさんのおっしゃるとおり、何らかの原因で「perl内部でperlモジュールを探すパスが削除された・壊れた」可能性がありますね。

動かなくなるまでの間に、Windows Updateとか、Patchあてとか、はたまたウィルス対策ソフト等々の更新とかしませんでした?(これらが原因になるときって、あるのですよ(泣))

まずは、Perl環境再インストールはいかが?(危なくて、できませんか? 複数台マシンがあれば、遅くていいのでXPマシンに新規インストールして、試すといいですよ)
Commented by kototubo at 2005-10-02 00:13
>GALANT's Cafeさん えーもー素人一人でなんかしようとすると
ロクなことにならない見本みたいな有様です。
時間をみつけて再インストールしてみますー。
Commented by xiaoxia at 2005-10-04 11:14
今ごろナニなのですが、printが動いているなら、再インストールはしなくても大丈夫そうな気がしますが。
1バイト文字は置換できて、2バイト文字が置換できないのは、可能性として2つ。ソースがeuc-jpでない、または入力ファイルがeuc-jpでない、でしょうか(笑) いや、笑い事でなく、マジでありますから。1バイトの置換ができるか試していないのでしたら、先に試してみるのも良いかと思います。1文字の置換は文字コードに依存しないので、これで出来たら、文字コード系で問題がある可能性があります。

euc1文字置換は危険というのは、例えば「△」は実は¥xA2¥xA4という2バイトの並びです。同じように
ア=¥xA5¥xA2
は=¥xA4¥xCF
なので、「アは」と並んでいたら、「ア」の後ろ半分と「は」の前半分で、¥xA2¥xA4と並ぶわけで、これがコンピュータには△と同じ並びに見えてしまって、置換しちゃうわけです。で、結果を見ると、文字化けしているわけです。
eucではこういうことが起こりやすいので、置換する時には注意が必要なのです。これで悩まされる人は多いです。
何となく「ふぅん」と思っていただけますでしょうか(笑)
Commented by kototubo at 2005-10-05 00:14
>小霞さん 入力ファイル…euc-jpでないかもしれません。(汗)
というか、やはりeuc-jpにしますと文字化けます。

「euc1文字置換は危険」の例、ありがとうございます!分かりやすいです。

しかし、結局一体どういう方法ならやりたいことができるのか、
分からなくなってきました。
今一度、最初に戻っていろいろ検証してみたいと思っています。
また泣き言記事があがったら、どうぞよろしくおねがいしますっ。(オイ)
by kototubo | 2005-09-28 00:21 | PC&Technology。 | Comments(8)