• ベストアンサー

この置換処理について

以下の処理がうまくいきません。 perlで実行すると以下の置換を行ってテキストファイルができるはずなのですが、0KBのテキストファイルができてしまいます。 そこで、手動で置き換えようと思ったのですが。 正規表現を使用した、置換処理を行っているということはわかっているのですが中の処理が分かりません。 詳しい処理の内容を教えていただけないでしょうか。 よろしくお願いいたします。 while(<>){ if(m#^(.+) /// (.+)$#){ $flg = 1; $word = $1; $text = $2; $line = $_; if($word =~ / /){ #熟語なら if(length($word) > 15){ $flg = 0; } elsif($word =~ /([A-Za-z]+) ([A-Za-z]+)/){ if(length($1) > 5 && length($2) > 5){ $flg = 0; } } } if($text =~ m#/#){ $text =~ s#/ .+##g; } } if($flg){ print $word.' /// '.$text."\n"; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

あー、入力テキストがUTF-16なんですか。 だとすると、きちんとエンコーディングの設定をして読み込まないといけませんが、 スクリプトの、質問に貼られている以外の部分はどうなっていますか?

kkk311
質問者

お礼

スクリプトは質問内容ので全てです。 試しにSift-JSに変換してで試したところ、うまくいきました! でもなぜでしょうか…

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

UTF-16 では全ての文字が 16ビットで表されます. つまり「/」が例えば "\0/" のようになっているわけです. スクリプトの文字コードがどうなっているか知りませんが, そのために最初の if でマッチしていないんじゃないでしょうか. 今どきの perl では内部的に全て UTF-8 を使いますから, それ以外の文字コードのファイルを予定するときにはきちんとエンコーディングを指定しないとダメです. 「shift-jis にして動いた」というのは, たまたま英語なのでシフトJIS でも UTF-8 でも同じになっていたということだと思います.

kkk311
質問者

お礼

ありがとうございます! なぞが解けました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

私もそれを最初に思ったので #1 で「実際にはどのように入力して実行したのですか」と補足を求めたんですけどねぇ>#2. 「実際」の実行が #1 の補足にある通りなら (ほとんどの場合で) その線はないですし.... できればでいいのですが, 「与えた入力」と「期待する出力」を書いてもらえると助かるかもしれない.

kkk311
質問者

補足

実際の入力は以下です。 Perl\Bin\Perl eimin.pl c:\jiro.txt > c:\abc.txt 入力元のファイルは167MBの英語辞書テキストファイルです。(Unicode UTF-16) 期待する値は、長い熟語や名詞などを削除して小さくすることです。 ファイルが大きすぎるのでしょうか…

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

ひょっとして、変換元のファイルと変換先のファイルで同じファイルを指定してたりしませんか?

kkk311
質問者

お礼

ありがとうございます。 入力元と、出力先は別名で設定していました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その「0kB のテキストファイルができた」ときは, 実際にはどのように入力して実行したのですか?

kkk311
質問者

補足

こんにちは、実行したときには以下のように入力しました C:\Perl\Bin\Perl c:\プログラム.pl c:\変換元.txt > c:\変換先.txt

すると、全ての回答が全文表示されます。

関連するQ&A