はじめまして。perl初心者です。
見よう見まねでやりはじめたのですが。どうしてもわからないことがあります。
数十行ぐらいのテキストファイルがあるのですが、その中を訂正するcgiを作成しています。
htmlからそのファイル名を指定して、
open (DATA, "$file1"); #$file1がファイル名
として
htmlのテキストエリアに表示して訂正し、それをさらに別のcgiで書き込むようにしています。
print "<form ACTION=\"hensyuu.cgi\" METHOD=\"POST\">\n;
print "<textarea name=\"MSG\" cols=100 rows=30>\n";
foreach $gyou ( < DATA > )
{
print $gyou;
}
print "</textarea>\n";
print "<input type=\"submit\" value=\"書込\">\n";
print "</form>\n";
hensyuu.cgiは
open ( DATA,">>$file1" );
#ここでtextareaの内容を読み込み
print DATA "$in{MSG}";
close ( DATA );
編集したデータを見ると、各行ごとになぜか空白行が入ってしまいます。
バイナリエディタで見ると通常の0D0Aの前に0Dが追加され、0D0D0Aとなっているために
そうなっていると思われます。
これってそういうものなのでしょうか。
それとも根本的にこんなやり方は間違っているのでしょうか。
ご教授のほど、よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
LFの処理系でCRLFのファイルをそのまま読み込み:CRLFのまま残る
→LF改行のファイルだとして、CRLF改行に変換:もとのCRはそのまま、LFがCRLFに変換される
→CRCRLF
ということだと思われます。
で、CRLFが出てくるのでWindowsを使っていると思いますが
・CGIを実行しているのはどこ?
・出力ファイルはどこにできるの?WindowsPC上でなかったらどうやってコピーしてくるの?
Windows → Linux等のunix系で動作しているhttpサーバーで CGIを実行 →ファイルをアップロード(このときはバイナリーモード) → サーバー上にファイルが作成 →ftpでPC へ(このときはテキストモード)
ってなってませんか?
対処方の一つは、どこかでCRを取り除くことです。
foreach $gyou ( < DATA > )
{
$gyou =~ s/\r//g; #←とか
print $gyou;
}
No.1
- 回答日時:
改行は論理的には「\n」ひとつなんですが、環境によって実際の文字コードが違ってきます。
Unix系→LF(0x0A)
Windows系→CR,LF(0x0D,0x0A)
Macintosh→CR(0x0D)
プログラム単体で動くのでいいんだったら、
・一行読み込み
・改行を削除(chop($line); )
・文字列処理
・改行付きで出力(print $line, "\n";)
でいいんですが。
WebサーバはUnix系だけども、表示したブラウザはWindowsだったりMacだったりするので困るのです…。
----
私が過去に作ったスクリプトでは、こんな乱暴な処理をしてました。
$buffer に全行読み込み後、
$buffer =~ s/(%0D|%0A)/&/g;# CR / LF は全て「&」文字に置換
$buffer =~ s/&+/&/g;# 連続&をまとめる
$buffer =~ tr/&/\n/;# &を1改行とする
これでも良かったのは、扱うデータが特定のCSVファイルだったため、
・「&」文字が出てこない(自分のデータファイルでは)
・空行は存在しない
という条件があったからです。
「&」文字ではなく、「%01 」みたいな文字データに出てこない(漢字等であっても)文字(コード)に置換するのが良いかも知れません。
空行の問題が解決しませんが…。
----
あるいはどうせ3パターンなので、$bufferに読み込み後、
$buffer =~ s/\r\r\n/\n/g;
$buffer =~ s/\r\n/\n/g;
$buffer =~ s/\r/\n/g;
と流してしてしまってもいいのかも?
回答ありがとうございます。
自己解決しました。
ご指摘いただいたとおり、各行を表示する前や
その後のファイル書込み前に改行コードを削除してみましたが
変化ありませんでした。
ただそこで気づいたのが、ファイルの最後の改行だけは削除されています。
ということは、変数MSGが複数行のデータではなく
1行のデータとして認識されているのでは?
と考えました。
そこでファイル書込み前に
@kakikomi = split ( /\n/, $in{MSG} );
としてデータを改行コードで配列に変換し、
書込みのときに
foreach $a = ( @kakikomi )
{
chop ( $a );
print DATA "$a\n";
}
としたところ、うまくいけました。
自己解決したとはいうものの、kmeeさん、asciizさんのご指摘がなければ
解決できなかったところです。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オープンしたファイルで行の連結
-
perlで大容量CSVのsort方法につ...
-
perlでファイル内の文字列を置...
-
perlのflock関数でロックをかけ...
-
教えて!perlから.exeファイル...
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
batファイルでrenameができませ...
-
sprintfについて
-
ExcelをCSV書き出す場合のシー...
-
Pythonでegrep機能をつかいたい
-
awkスクリプトでダブルクォーテ...
-
バッチファイルの作り方(CSV→...
-
C言語で特定の行を抽出する方法...
-
ディレクトリ構造の表示
-
ReadLineでの読み出し行を指定する
-
perlで先頭の数値をみて昇順に...
-
C言語でのファイルのデータ更...
-
csvファイルの横方向への改行に...
-
MySQLにバイナリデータを正常に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
改行コードが勝手に
-
perlを用いた特定文字列間の抽...
-
open中のファイルをrename
-
巨大ファイルの行をを逆順に並...
-
perlのflock関数でロックをかけ...
-
ジョブショップスケジューリング
-
telnet接続
-
AutoCADのスクリプト
-
Perl で syntax error
-
perlで大容量CSVのsort方法につ...
-
オープンしたファイルで行の連結
-
アルゴリズム java お店の営業...
-
Perl変数から外部プログラムの...
-
クリックを何回もされて、重複...
-
IF文について
-
Perlで他サイトの情報を取得し...
-
GD.pmで作成した画像を保存する...
-
cgiの投票回数制限設定について...
-
ハッシュにファイルハンドル
おすすめ情報