• ベストアンサー

perlでの改行コードの置換

perlで改行コードを置換したいのですが・・・ もとのファイルはS-JISコードでその中身をEUC(UNIXで使用するために)に変換します。ここまではOKなのですが、改行コードがうまく行きません。 改行コードをUNIXで使うためにLFだけにしようと思い、 $line =~ s/\r\n/\n/g; (これは\r\nで引っかからない) とか $line =~ s/\n/\x0A/g; とかにしてみたのですがうまく行きません。 どのようにすればよろしいでしょうか?

  • mune
  • お礼率13% (21/151)
  • Perl
  • 回答数5
  • ありがとう数5

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

  • ベストアンサー
noname#25358
noname#25358
回答No.5

 えーと、それはおそらく、binmode関数に対して出たエラーではありません。  \x81は漢字の始まりを示すキャラクターですので、ファイルディスクリプタ(今回の場合は文字列「OUTPUT」のこと)に漢字が使われている、という意味になります。  近くにそれっぽいエラーが出ているところありませんか?  秀丸の「行番号の計算方法」が「エディタ的」になってないかどうかも確認してみてください。

mune
質問者

お礼

原因がわかりました。binmode(OUTPUT);のあとにコメント#を入れていたのですが、その#の前に全角のスペースが入っていたためと思われます。その全角スペースを半角スペース変更したら動きました。 本当にありがとうございました!!

その他の回答 (4)

noname#25358
noname#25358
回答No.4

 やっと分かりました(^_^; 全部Windows上でやってるんですね(^_^;  えとですね。  いくら処理をしても、書き込み時に強制的に改行文字が変化してしまいますので、現状のままではどんな処置をしても駄目です。  これは Perl の仕様ですので、お望みの処理を行うためにはバイナリモードで書き込みを行わなければいけません。  具体的には、書き込み用にファイルをオープンする際、   open(OUT, '>data.txt');  とまあ、このような処理を入れていると思いますが、この直後に、   open(OUT, '>data.txt');   binmode(OUT);  こういう処理を入れてください。これで、改行文字がCR+LFに変換されなくなります。  なお、UNIX上ではbinmode関数のこのような使い方は意味を成しませんのでご注意を。

mune
質問者

補足

ありがとうございます。はじめに作業環境を伝えておけばおかったのですが・・・ 上のように open OUTPUT, ">$out_filename"; binmode (OUTPUT); とやったのですが、 Unrecognized character \x81 at ssjis2euc.pl line 26 と26行目、丁度binmode (OUTPUT);の行でエラーが出ている(?)ようです。私のマシンにはこの関数bimodeが入っていないということなのでしょうか?

noname#25358
noname#25358
回答No.3

 えと、気づいたことがあるので補足を。  その処理が正しく行えているかどうかの確認はどうやってなさってるのでしょうか?  確認は必ずUNIX上で行わないと、ブラウザやFTPを通したりすると改行コードはCrLfに戻ってしまいます。  また、WindowsのみでHTTPサーバーを上げてテストなどを行っているときは、「¥n」で「CrLf」の2文字をあらわします(httpサーバーの仕様によると思いますが)。  そのへん確認してみてください。

mune
質問者

補足

WINDOWS上でエディタを2つ使用して確認しています。 まず、あるテキストファイル(SJIS)を「秀丸エディタ」で開いてから名前をつけて保存をするときに「文字コードをEUCで改行コードをLF」と選択します。そしてこの保存したEUCコードのファイルを「MIFES」で開くと改行の部分がきちんとLF(16進の0A)だけとなっています。 しかし、これをperlで改行部分を処理して、元々の改行部分(CR+LF)のCRを削除したいのですが・・・「MIFES」で開いてみても、改行部分がCR+LF(0D,0A)となってしまって、削除できでいないということなのですが。

noname#25358
noname#25358
回答No.2

 とすると、何らかの理由で最初から改行文字がUNIX形式になってるってことですね。  改行文字に¥rが含まれていないのだから、反応しなくて当然です。  そういう場合は何もしなくていいんですよ。

mune
質問者

補足

いや、そのままUNIXで開くと、^M(おそらくCRだとおもうのですが・・・)と表示されてしまいます。

noname#25358
noname#25358
回答No.1

 これはですね。  バグなのかどうか知りませんが、一部のエスケープシーケンスは通常のスカラー変数に入っているときと $_ に入っているときとでは扱いが変わる(らしい)というのが原因です。  ですから、MS-DOS系改行コードである \r\a をUNIXの改行形式に治すには、  $_ = $line;  s/\r//g;  $line = $_;  とします。俺が作ったフリーソフトはこれで正常動作してます。

mune
質問者

補足

やってみたのですが、 s/\n/\r/g; でやるときちんと改行(CR+LF)が\r(CR)に変換されるのですが、 目的の\r(CR)だけを取り除く s/\r//g; としても改行(CR+LF)の\r(CR)が引っかかりませんでした・・・ 他の方法なにかありますでしょうか。

関連するQ&A

  • ファイル出力の改行コードをLFに

    また質問です。よろしくお願いいたします。 WindowsXPでperl5.8.7の環境です。 出力したファイルの文字コードをEUC、改行コードをLFで出力をしようとしています。 なお入力、出力ファイルには日本語が含まれています。 文字コードは希望通りいくのですが改行コードがうまくいきません。 Windowsのデフォルト改行コードCR+LFが出力されてしまいます。 (Terapad(エディタ)の改行コード表示がこうなっています。) (1)binmode(OUT);で行うと、 Wide character in print at jisyo01.pl line 63, <IN> line 97. というエラーが表示され、出力されない。 (2)$xxx[$i] =~ s/\x0D\x0A/\x0A/g; で改行コードを置換しようとしても、置換されず、 CR+LFである。 (3)$/ = pack("C", hex("A"));で 改行コードをchompした後、print OUT "$/";としても、 CR+LFのままである。 上手くいきません。いい方法ないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • csvファイル改行コードの置換について

    お世話になります。 csvファイルで作成したデータを出力表示させるスクリプトで csvファイル内の改行コード(セル内)以後のデータが出力できません。 下記の置換で改行コード以後のデータが表示されません。 $abc =~ s/\r\n//g; $abc =~ s/\n//g; $abc =~ s/\r//g; csvファイル内の改行の数が多く、1行のデータが改行の為に、2行になったりしているので出力前に置換し表示させる方法です。 csvファイル作成時につく""は正常に置換しています。 似たような質問もあったのですが、少し違うようですので質問いたしました。 何卒、ご教授お願いいたします。

    • ベストアンサー
    • Perl
  • Perlでの改行コードについて

    <textarea>に入力された値をPOSTで渡し、ポスグレに書き込み、それをHTML上で表示する処理をしているのですが。 textareaで改行を入力した場合に、 DB内に改行が登録されません。 例: *textareaのwrapはsoftに設定してあります。 あいうえおかきくけこ さしすせそ と入力すると。 DBには 「あいうえおかきくけこ さしすせそ」 と登録され 表示では「あいうえおかきくけこさしすせそ」と表示されます。 ソースでみると 「あいうえおかきくけこ さしすせそ」と表示されています。 改行コードの置換がされていないのだと思い INSERT前に s/\r\n/<BR>/g; s/\r/<BR>/g; s/\n/<BR>/g; を使い置換をすると DBには何も登録されません。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 【正規表現】【javascript】CR、CR・LF、LF改行コードをLFにしたい

    CR、CR+LF、LFのシステムによって異なる3種類の改行コードを LFに置換したいです。 変数hogeに置換対象の文字列が入っているとして、 hoge.replace(/\r\n/g,"\n").replace(/\r|\n/g,"\n"); とreplaceを使って置換してみました。 うまくいってるようですが、replaceを二度使ってるところが、カッコ悪いなぁと思います。 replace一回ですむような方法がありましたら教えてください。

  • CGIで改行タグを改行コードに変換ってできますか?

    CGIで改行タグを改行コードに変換ってできますか? $text =~ s/\r\n/<br>/g; $text =~ s/\r/<br>/g; $text =~ s/\n/<br>/g; で確認画面上で表示されるtextareaの文章は改行されるのですが、 届いたメールには<br>と表示されてしまって困ってます。 PHPでは変換できるみたいなのですが、perlでも出来るのでしょうか?

    • ベストアンサー
    • CGI
  • ”ァー”が含まれている文字を置換すると文字化け

    OS:solaris8 perlのver:5.8.6 perlで、”ァー”が含まれている文字列に対し、 全角スペースを半角スペースに置換しようとすると 文字化けしてしまいます。 (”ぁー”でもどうようでした) ”ぃー”や”ぅー”、”ぁ”では 問題無いのですが…。 当方、perl初心者&文字コードに詳しくないため、 原因がよくわからないでいます。 どなたか原因をおわかりの方、 ご教授お願いいたします。 文字コードはEUCです。 以下はソースです my $line = "ファイヴァー スコープ 眼鏡"; $line =~ s/\t/ /g; # タブを半角スペースに置換する print '$line2='.$line."<br>\n"; $line =~ s/ / /g; # 全角スペースを半角スペースに置換する print '$line3='.$line."<br>\n"; #↑ここで文字化けしてしまいます $line =~ s/^\s+//; # 頭の空白を除く print '$line4='.$line."<br>\n"; $line =~ s/\s+$//; # 尻の空白を除く print '$line5='.$line."<br>\n";

    • ベストアンサー
    • Perl
  • 改行コードについて

    HTMLフォームのテキストエリアで改行した場合の処理についてご質問します。 Windowsのローカル環境で試しています。 改行コードLFでPHPを作成しています。 ○改行コードの認識 LF(\n) Unix,Mac OS X CR(\r) Mac OS 9 CRLF(\r\n) ○テキストエリアからの入力値の処理 CRLF、CRをLFに変換しています。 $value= str_replace ("\r\n", "\n", $value); $value = str_replace ("\r", "\n", $value); このあとDBに値を格納しています。 ○出力の際の処理 DBから値を取得。 phpのprint関数で下記を出力。 <textarea >${value}</textarea> 上記処理で、ローカル、サーバともに正常に動作しています。 しかし改行コードがLF(\n)なのでCRLF(\r\n)のWindowsで表示したときには問題が起きそうな気がします(実際には正常に動作)。 なにかしっくりこなくて質問させていただきました。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • VB6のテキスト処理 さまざまな文字コード/改行で対応

    VB6のテキスト処理で、Open InputとLine inputを使った場合に 文字コード/改行コードが SJIS/CRLFの時は正しく1行を読み込む事ができますが、改行がLFの時は正しく1行を読み取りません。 改行コードがLFもしくはCRの場合でも正しく1行を読み取る方法はあるのでしょうか? また、文字コードに関してもEUCやUTF-8,JISでも対応できる方法がありましたら教えて下さい。

  • Windowsでの改行コード

    HTMLを書くのにあたりUNIXサーバが主流なのだから、 UTF-8、改行コードはLFで行うことを勧められました。 Windowsの改行コードはCR LFだそうですが、 LFにした場合、Windows上でJAVAScriptなどのテストをしたときに 何か不都合があるのでしょうか。 改行コードが CR LF でUNIX上でトラブルになった事例は見つけました。 反対のことが良く分かっていません。よろしくお願いします。

  • UNIXでの改行コードの置換

    2バイト改行コードが入ってるデータを1バイト改行に置換してから、 コボルにて入力ファイルとして扱いたいのですが、 UNIXのコマンドで、置換することは可能でしょうか? ちなみにファイルは可変長です。 どなたかご存知の方がいられましたら、ご教授頂けます様よろしくお願い致します。