• ベストアンサー

perlで、[ \r\n , \n ]の意味は?

シンプルなCGI掲示板の勉強中ですが、 $message =~s/[ \r\n , \n ]/<br \/>/g; となっており、 これは改行文字を<br />に置き換えるのだそうですが、 [ \r\n , \n ]の部分というのはどういった意味でしょうか。 [ abc ]だと、a,b,cのうちどれか1文字は入っていれば良いですよね。 [ ]に「,」が入るとよく分からなくなります。 お分かりの方、教えてくださいませんか。 よろしくお願いいたします。

  • CGI
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • Kirishima
  • ベストアンサー率32% (155/480)
回答No.3

サンプルは、 $message =~ s/\r\n/<br \/>/g; と $message =~ s/\n/<br \/>/g; 1行で済ませようとして間違ってしまったのでしょうか? \r 復帰文字(return) と \n 改行(newline) と 「,」カンマそのもの と \r 復帰文字 (return) のいずれかを<br />に置き換える、という意味になってしまうでしょうね。 この目的のためには、 $message =~ s/\r\n/<br \/>/g; $message =~ s/\r/<br \/>/g; $message =~ s/\n/<br \/>/g; と3行記述するのがいいのではないでしょうか? 参考サイトに私が勉強させてもらっているサイトを紹介しておきます。

参考URL:
http://www.rfs.jp/sitebuilder/perl/04/07.html
cgi_syoho
質問者

お礼

ご指導くださいまして、どうもありがとうございます。 Kirishima様や他の方たちのご説明から判断して、 $message =~ s/\r\n/<br \/>/g; $message =~ s/\r/<br \/>/g; $message =~ s/\n/<br \/>/g; の3行で記述したほうが無難な気がしますね。 ご質問したソースは「CGI/Perl Handbook」の掲示板ソースにありますが、 間違い又は不十分なのですね。 Kentさんの本には、ご説明のソースが載っていました。 ほぼ同じ掲示板でも記述の仕方がいろいろあり、本当に困ってしまいますね。 また機会がありましたら、ご指導いただきたいと思います。 どうもありがとうございました。

その他の回答 (2)

  • bricks
  • ベストアンサー率69% (16/23)
回答No.2

この文の意味が 一般的な改行コード「\r\n」「\n」を XHTMLの改行要素「<br />」に変換する という事でしたらこの文は間違いです。 上の意味の文は $message =~ s/\r?\n/<br \/>/g; となります。 ただし改行コードはMACの「\r」もあるので これでは不充分です。 「\r」も置きかえるようにようにしてください。 [ ]内の「,」はただのコンマです。 なんの意味もありません。

cgi_syoho
質問者

お礼

ご指導いただきまして、どうもありがとうございます。 CGI初心者で、いろんな書籍を購入して勉強していますが、 「改行コード処理」一つをみても、 ソースの記述がいろいろあって、混乱していまいます。 Macの\rにも対応となると、ご質問したソースでは不十分なのですね。 結局一行では全て済ませることができないということになりますね。 大変よくわかりました。どうもありがとうございます。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

実験: % cat a.pl @msgs = ( "ab\ncd\n", "ab\r\nc", "ab\n\r", "ab,c d\n" ); for $message ( @msgs ){ $message =~s/[ \r\n , \n ]/<br \/>/g; print $message, "\n"; } % perl a.pl ab<br />cd<br /> ab<br /><br />c ab<br /><br /> ab<br />c<br />d<br /> ――ということで、「空白」「カンマ」「復帰」「改行」を、<br />に全置換する、で、あっているかと。

cgi_syoho
質問者

お礼

実験データを示してくださいまして、どうもありがとうございます。 大変参考になりました。

関連するQ&A

  • RE:\r\nと\nの違い?

    下記スレッド http://oshiete1.goo.ne.jp/qa4137451.html で以下のような質問をしていたのですが、 <質問開始> よくメールフォームの本文部分やヘッダー部分の改行などで\r\n又は\nが使用されていますが、\r\nと\nは何が違うのでしょうか? どちらも通常の改行のように思えますが。 <質問終了> 途中で質疑応答が途切れてしまいました。 上記の質問への回答から、私の理解は以下のようになりますが、私の理解は正しいのでしょうか? <私の理解開始> TinyPineさん ご回答、ありがとうございました。 つまり、PHPにおけるmail関数のメッセージ組み立て部分では、改行はつねに「\n」ではなく、「\r\n」で記述するべきということですか? また、PHPにおけるmail関数のメッセージ組み立て部分で、メッセージの行間に間をあけたくない場合、\r(復帰)で改行すればよいのでしょうか?「\r\n」又は「\n」では、行と行の間に一行空白ができてしまいますが? <私の理解終了> お分かりの方おられましたら、私の理解が正しいか判定をお願いします。

    • ベストアンサー
    • PHP
  • \r\nと\nの違い?

    よくメールフォームの本文部分やヘッダー部分の改行などで\r\n又は\nが使用されていますが、\r\nと\nは何が違うのでしょうか? どちらも通常の改行のように思えますが。 よろしくお願いします。

    • 締切済み
    • PHP
  • 掲示板を作成する際に・・・

    掲示板を作成する際、 文章を等間隔に表示させたいために、 文章を格納している$comに <pre>$com</pre> としてみました。 (大抵のスクリプトでは、「図/表モード」 の場合、<pre>$comment</pre>となっていたからです。) 確かにこれで文字は等間隔に表示されましたがこれだと メッセージ欄で空行(一行空けること)を入れた場合、 空行が無くなり、改行にしかなりません。 改行(とタグ)に対して以下のようにしているのですが・・・・ $com =~ s/\"/&quot;/g; $com =~ s/</&lt;/g; $com =~ s/>/&gt;/g; $com =~ s/<br>//ig; $com =~ s/\r\n/<br>/g; $com =~ s/\r/<br>/g; $com =~ s/\n/<br>/g; $com =~ s/\t/ /g; CGIとPERLはまだかじった程度の知識しかないので どうすればいいのかわからないので教えていただきたいのですが・・・。

    • ベストアンサー
    • CGI
  • cgi:textareaでの改行を<br>に

    perlでcgiを作成しています。 <textarea>などで投稿されたテキストの改行文字を<br>に変換するために、 $value =~ s/\r\n/<br>/g; $value =~ s/\r/<br>/g; $value =~ s/\n/<br>/g; のように処理していました。が、<textarea>内で最後に何度もenterを押す人がいて、結果、 hoge<br>hoge<br><br><br><br><br><br><br> のようになってしまいます。 hoge<br>hoge のようにしたいのですが、パターンマッチをあまり勉強していないので、 よくわかりせん。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • CGIで改行タグを改行コードに変換ってできますか?

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

    • ベストアンサー
    • CGI
  • textareaで改行すると、修正時、書き込んだデータがなくなります。

    CGIのカスタマイズに関する質問です。 ソードワールドRPGキャラクターシート管理CGIを使用しています。 初期の設定で<input type>と<textarea>の改行をする際は<br>を使うと言う形になっています。 その中で<textarea>の改行をエンターキーでしたいと思い、 sub htmlunquote{ my $text = shift; $$text =~ s/&lt;/</g; $$text =~ s/&gt;/>/g; の部分を sub htmlunquote{     my $text = shift; $$text1 =~ s/\r\n/<br>/g; $$text1 =~ s/\r/<br>/g; $$text1 =~ s/\n/<br>/g; と変換してみました。 すると、エンターキーで改行できるようになったのですが、修正や追記しようとすると、何故か前に書き込んだ文章が消えてしまっています。 なぜ、文章が消えてしまうのか、全く検討がつきません。FFFTPから、データを覗くと、書き込まれたデータはあるのですが……。 それとも改行をさせる方法が根本的に間違っているのでしょうか。 ご教授お願いいたします。

    • ベストアンサー
    • CGI
  • TEXTAREAの改行がうまくいきません。

    自作で掲示版を作成している、初心者です。現在作成中の掲示版にTEXTAREAに入力し、LOG上では1行目<BR>2行目といった形で改行をBRに置き換えて保存していますが、その修正としてLOGからデータをとり改行状態で表示させたいのですが、 うまく改行されない状態です。下記にLOGより読み込み。タグを\rに置き換えて いますが、TEXTAREAに表示されなく、改行表示どころではありません。 いったいどうすればよいのでしょうか?ご教示をお願いします。 <CGI文> $wkaaa1 = $IXUSERINF{Enaiyo}; データを取得 $wkaaa =~ &notag1($wkaaa1);  変換(これがおかしい?) $mesbuff .= "<TR><TD nowrap ><TEXTAREA ROW=\"10\" COLS=\"48\" NAME=\"Enaiyo\" WRAP=\"soft\">$wkaaa </TEXTAREA></TD></TR>"; <sub> sub notag1 { local($_) = @_; s/&/&amp;/g; s/"/&quot;/g; s/</&lt;/g; s/>/&gt;/g; s/&lt;br&gt;/\n/gi (これで <BR>を\n(改行)にしてるつもり return $_; }

    • ベストアンサー
    • CGI
  • cgiで文章を32文字ごとに改行

    cgi初心者です。 入力画面→確認画面→送信 上記のメール送信を作成中なのですが、入力画面で入力した文章を32文字ごとに改行し、もし文章内のURLに改行が入る場合は、URLが終わった後に改行をするようにしたいのですが、出来ません。 コードはEUCになります。 現在は下記ソースになります。 $body = '32文字で改行したい。ただしURL内で改行する時はURL(http://test/htt/test/test/?test=test#test終わりに改行したい。'; $body =~ s/((?:[\xA1-\xFE][\xA0-\xFF]|.){32})/$1\n/go; $body1 =~ s/(htt[\w\.\~\-\/\?\&\+\=\:\/]*)\n([\w\.\~\-\/\?\&\+\=\:\/]*)\n([\w\.\~\-\/\?\&\+\=\:\/]*)/<b>$&<\/b><br>/g; $body1 =~ s/(ht[\w\.\~\-\/\?\&\+\=\:\/]*)\n/$1/g; 文章の文字数を算出し、32文字で割った回数をまわし、32文字ごとに\nをいれてみたりもしてみたのですが、半角が途中に入ると文字化けてしまったりして現在に至ります。 ご教授お願い致します。 cgi初心者な為、コードも添えて頂ければ助かります。

    • ベストアンサー
    • CGI
  • RE:\r\nと\nの違い?

    下記スレッド http://oshiete1.goo.ne.jp/qa4126744.html で以下のような質問をしていたのですが、 <質問開始> よくメールフォームの本文部分やヘッダー部分の改行などで\r\n又は\nが使用されていますが、\r\nと\nは何が違うのでしょうか? どちらも通常の改行のように思えますが。 <質問終了> 途中で質疑応答が途切れてしまいました。 上記の質問への回答から、私の理解は以下のようになりますが、私の理解は正しいのでしょうか? <私の理解開始> こちらの理解からすると、「\r\n」と「\n」はWindowsにおいては同じ意味。ただし、OSがUnixの場合も考え、「\n」よりは「\r\n」の方がよいということでしょうか? また、「\r\n」と「\n」は改行で、「\r」は復帰。 <私の理解終了> お分かりの方おられましたら、私の理解が正しいか判定をお願いします。

    • 締切済み
    • PHP
  • htmlファイルの改行について

    複数ある html ページから、改行部分( <BR> ではなくて )、を自動的に削除して再び保存する、というプログラムを自作しているのですが、\r\n, \r, \n に当てはまらない改行コード? があるみたいで、完全に取りきれないのです。 $input =~ s/\n\r//g; $input =~ s/\n//g; $input =~ s/\r//g; もしくは、 $input =~ s/\x0D\x0A|\x0D|\x0A//g; という具合にしているのですが、予想では、数行にわたるhtml タグから全ての改行が取り除かれ、一行にまとまると いうイメージがあるですが、ところどころ改行が残ります。何がいけないのでしょうか・・・

    • ベストアンサー
    • Perl