トップページphp
1001コメント358KB

Perl 初心者コーナー Part23

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん03/05/16 11:18ID:zDRBc/j4
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0867nobodyさん03/06/05 02:52ID:???
BBSの入力項目を1つ増やすだけ、の話をするヤシは、
プログラマ板のデスマーチ大作フラッシュを見て泣いてくれ。

スレに関係ないのでsage
0868nobodyさん03/06/05 02:57ID:ECImrkCL
>>863

全く同感。

俺も最初は他人の物に手加える方が楽かと思ってたが、
あるキッカケで丸ごと自作のを書いたら、そっちの方が
楽だったし、何よりも頭に入った。
おかげで、他人のスクリプト見ても理解する能力も格段に進歩したし。

他人のもんいじるって言うのは、工数自体は少ないから
楽に感じるかもしれないけど、実はあまり足しにならないし、
いつまでたっても初心者になり続ける罠。
086986803/06/05 03:00ID:ECImrkCL
あ、というか、今はバイトでperlやってるけど、他人のものいじる
方が全然疲れるし難しいと思うよ。まーそりゃ予めいじられるのを
前提としたフラグとかある部分に関してはそんなことないけど。

それに単機能の掲示板作るのって全く難易度高くも何ともないと思うんだけど。
それすら酷って言う奴は…
初心者と認められるにはワンライナー限定っすか?
0870_03/06/05 03:03ID:???
http://homepage.mac.com/hiroyuki43/jaz04.html
0871nobodyさん03/06/05 03:04ID:???
アセンブラをいぢってたこともあって、リファレンスやらポインタは難無く理解できた。
がしかし、クラスやらインスタンス、淫ヘリ箪笥・・・ちーっとも理解できていません(つД`)

movem.l d0-d7/a0-a6,-(sp)
の頃が懐かしい、、、
0872直リン03/06/05 03:10ID:C/yWLjzO
http://homepage.mac.com/yuuka20/
0873nobodyさん03/06/05 03:10ID:???
>>866
あぁ、わかります。
フォーム内容のデコードとか画像アップロードする際の
--------- ←こんなのの除去とか、
「プログラミング言語」とは直接関係の無いことかもしれないけど、
知ってると知ってないじゃ全然違うし知ってなきゃいけないことだし。

俺が初めて買った「Perl/CGI入門」系の本も、
ccgi-lib.plとjcode.plを使えと書いてあったけど、
アレを読んでも何が行われているのかは全くわからないな。
「動けばいい、内部構造など知らん」ってのは
プログラマの立場としてはあんまり良くない態度だわなぁ。
0874nobodyさん03/06/05 07:30ID:UTEewkkC
クライアントアプリをperlで作るにはどうすればいいのでしょうか?
ベクターなどで探してもコマンドラインを使って操作するようなアプリしかなかったのですが、
誰でも操作できるようにコマンドラインを使わないで
クライアントアプリを簡単に作る方法はないのでしょうか?
0875nobodyさん03/06/05 07:52ID:l4KCIFT8
じゃあコンソールで。
0876_03/06/05 09:06ID:???
http://homepage.mac.com/hiroyuki43/hankaku05.html
0877動画直リン03/06/05 09:10ID:C/yWLjzO
http://homepage.mac.com/hitomi18/
0878nobodyさん03/06/05 11:32ID:???
>>874
クライアントがPerlをインストールしている前提ならば、
Perl/Tkを使えば可能になる。
0879_03/06/05 12:06ID:???
http://homepage.mac.com/hiroyuki43/hankaku05.html
0880nobodyさん03/06/05 14:02ID:???
>>878
その点、MacOSXは有利だよね。

いまちょっといろいろと考えているんだけどね。
0881_03/06/05 14:10ID:???
http://homepage.mac.com/hiroyuki43/moe/jaz08.html
0882nobodyさん03/06/05 15:51ID:62PtIZ8T
ガイシュツかも知れないけど、cyrptの逆アセというか、
希望の暗号化文字を引っ張り出すような関数は
誰か作ってないのでしょうか?
0883nobodyさん03/06/05 16:04ID:???
>>882
そもそも非可逆なアルゴリズムなので、デコード的な処理は不可能。
0884nobodyさん03/06/05 16:23ID:uDBKSvvR
逆アセってなに?
0885nobodyさん03/06/05 18:36ID:???
逆アセンブルの略、、単に使ってみたかっただけでしょう。

そもそも、アルゴリズムは公開されてるんだし…

そもそも、概出だし…
0886nobodyさん03/06/05 19:03ID:y1a1B1oZ
キャップにmonaとか出してる人いるでしょ、ソレやりたいの。
0887nobodyさん03/06/05 19:11ID:???
>>886
はいはい、もうどっか逝って
0888nobodyさん03/06/05 19:21ID:???
<form method="post" action="admin.cgi">
<input type="text" name="comment" size="30"> //←メッセージ(たんなる例です)
<input type="submit" name="submit" value="送信する">

これで、admin.cgiにデータ送って、
readparseして、
そして、パスワード認証を済まして、実際にログファイルに記述、というCGIをつくりたいのですが、
html→データに書き込み。すると大丈夫なんですが
html→パス認証→データに書き込み。だと
          ↑ここでフォームのデータが送られないんですが、どうすればいいでしょうか?
0889nobodyさん03/06/05 19:25ID:???
だからCGIの質問はCGIスレでしてくれってば。
0890nobodyさん03/06/05 19:34ID:???
え、CGIってphpとかrubyとか全部含めてだから、
perlのことはPerlスレじゃないの?
0891nobodyさん03/06/05 19:37ID:???
Perlじゃないんだよ。
0892nobodyさん03/06/05 19:37ID:???
>>1にも書いてあるが、ここはPerlの「コーディング」のスレなんだよ。
そもそも>888はたまたまPerlを使ってるのかもしれないが、その質問自体は、
Perlに限られた話じゃないから、CGIスレ向けということ。
0893nobodyさん03/06/05 19:37ID:???
とりあえずソース晒せ。
0894nobodyさん03/06/05 19:40ID:???
でも既に>>181みたいなのにも答えてるわけだから、もはやコーディング専門というわけにも
いかんだろう。
アルゴリズムまで許容するとなれば、>>888のような質問もアリでは。
0895nobodyさん03/06/05 19:44ID:Dbz7wb1c
あなたが探してるのってこれだよね?でも眠れなくなるよ!
http://endou.kir.jp/betu/linkvp/linkvp.html
http://angelers.free-city.net/page003.html
0896nobodyさん03/06/05 19:46ID:???
>>893
えぇと、ソースといわれると、300行以上ありまして、
ファイルの作成、編集などのツールです。(ログファイルにというのは、簡単なたとえのつもりです。
要するにフォームのデータをパスワード画面を通して(1回余分な部分を通過して)送るにはどうすれば?ということが聞きたかったんです。)

できあがってるんですが、それにパスワードをつけないと危ないので、つけようとおもっているんです。
とりあえず、新規作成の時のhtmlのソースと、
作成のときのcgiのところをさらしますね。
パスワードとかはまったく手をつけてないじょうたいです。
0897nobodyさん03/06/05 19:47ID:???
<html><head>
<title>編集ツール</title></head>
<body>
<br>
<font size="3" color="#97cdee" face="富士ポップ">ファイルツール</font>
<br><br><font size="2">ファイルを新規作成します。</font>

<form method="post" action="admin.cgi">
<input type="hidden" name="s_mode" value="new">
<br><input type="hidden" name="s_type" value="file">
<table border="0"><tr><td>
<font size=2>名前</font></td>
<td><input type="text" name="name" rows="1" size="55"></td></tr> ///←ファイル名
<tr><td><font size="2">本文</font></td>
<td><textarea name="body" rows="22" cols="58"></textarea></td></tr></table> ///←本文
   <input type="submit" name="submit" value="送信する" style="30px">
<input type="reset" name="reset" value="リセット" style="30px">
</body>
</html>
0898nobodyさん03/06/05 19:48ID:???
>>890
888を見ただけじゃ、readparseって文字見て
恐らくPerlかな、としか分からないだろ。
Rubyかもしれないじゃないか。

ところで、パス認証って、CGIの中でやるやつか?
それともサーバ自体の機能かな?
0899nobodyさん03/06/05 19:48ID:???
>>896
そのHTMLファイルでパスワードを入力させるのは嫌なの?
0900nobodyさん03/06/05 19:50ID:???
#!/usr/bin/perl
require "./cgi-lib.pl";

&ReadParse(*in);
$name = "$in{'name'}";
$parmission = "$in{'parmission'}";
$oldname = "$in{'old_name'}";
$mode = "$in{'s_mode'}";
$body = "$in{'body'}";
$type = "$in{'s_type'}";

if ($type eq "file"){  ///大元で、ファイルの操作か、ディレクトリの操作かを区別

if ($mode eq "new"){  ///新規作成の場合

if ($name eq""){¬_file;}
else{
if (-e $name){&uwagaki_file;}
else{
open(FILE,"> $name");
print(FILE $body);
close(FILE);

print "Content-Type: text/html\n\n";
print "<html><head>\n";
print "<title>ファイル作成完了</title>$style</head>\n";
print "<body>\n";
print "<br><br><center><font size=2>ファイル($name)作成完了しました。</font><br><br>\n";
}}}
0901nobodyさん03/06/05 19:55ID:???
¬_fileはファイル名がない場合の警告、
&uwagai_fileは上書き時のメッセージです。
&uwagaki_fileには、open(FILE >$nameなども入っていて、上書きしし、「上書きしました」というメッセージを出す、サブルーチンです。

>>899
えぇと、htmlは省略してしまいましたが、
ファイル、ディレクトリのラジオボタン
新規作成、削除、編集、コピー、属性変更のラジオボタンがり、すべてできるようになっています。
(cgiでhtmlを出力していますが・・)

ですので、submitボタンを押した後に、パスワードの入力をもとめる、ってことがしたいのです。。。
0902nobodyさん03/06/05 19:55ID:???
>>898
単なるCGIの中での認証です。
0903nobodyさん03/06/05 19:57ID:???
>>901
なんでsubmitボタンを押してから入力させたいの?
一緒に入力させればいいのに・・・・
ちなみに最初の画面で入力したものをパスワード入力画面では隠しフィールドにでもすればOK


Perlとなんの関係もないね・・・
0904nobodyさん03/06/05 20:00ID:???
>>901
> submitボタンを押した後に、パスワードの入力をもとめる、ってことがしたいのです。。。
一度クライアントにフォームデータを全部hiddenで返して、再度passとともにcgiに送るしかないのでは?
0905nobodyさん03/06/05 20:01ID:???
>ちなみに最初の画面で入力したものをパスワード入力画面では隠しフィールドにでもすればOK
これって、入力画面では、>>897のが送られた場合、
&ReadParse(*in);
$name = "$in{'name'}";
$body = "$in{'body'}";

<input type="hidden" name="name" value="$name">
ってことでしょうか?

0906nobodyさん03/06/05 20:01ID:???
そういうこと。
0907nobodyさん03/06/05 20:02ID:???
>>904
やっぱりhiddenで送るしかないんですね。。。
>>903さんのおっしゃるとおりパスワードを一緒に入力させればいい話でしたね。。。
0908nobodyさん03/06/05 20:03ID:???
>>906
俺フォームメールでこれやって挫折したような覚えがあります。。
ここの住人の方が言ってくれるからにはできるんでしょう。
がんばってみます。。。
でも、一緒に入力するほうが、使用する側としても気分がいいですよね・
0909nobodyさん03/06/05 20:08ID:???
完全にCGIの話だったな。
0910nobodyさん03/06/05 20:09ID:???
では、ノシ
0911nobodyさん03/06/05 20:24ID:???
(*^-^)ノシ
0912nobodyさん03/06/05 20:31ID:???
ヽ(゜▽、゜)ノシ
0913nobodyさん03/06/05 22:10ID:mI0dWPG1
windows XPで
aとbという名前のティレクトリを子に持つディレクトリ内で

@dir = grep { -d } readdir( DIR );

とすると . と .. が入り

@dir = readdir( DIR );

とすると . と .. と a と b が入り、ディレクトリである a や b に
大して偽を返してしまうのですがなぜ a や bで-dは偽を返してくるのでしょうか?
0914nobodyさん03/06/05 22:11ID:???
熨斗
0915_03/06/05 22:17ID:???
http://homepage.mac.com/hiroyuki43/hankaku04.html
0916nobodyさん03/06/06 00:16ID:???
>>913
XPのバグじゃないの?
ほれ、関係者にメールだメール。
0917nobodyさん03/06/06 05:22ID:???
>>913
おそらく、readdir() で読み込んでるディレクトリと、-d した時点で参照してるディレクトリ
(カレントディレクトリ)が異なってるせいかと。
-d のときにフルパスでチェックするようにしてみては。
0918nobodyさん03/06/06 16:56ID:???
#!/usr/bin/perl

require "cgi-lib.pl";

&ReadParse(*in);
$name = "$in{'name'}";
$check = "$in{'check'}";

print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n<title>文法チェッカー</title>\n</head>\n";
print "<body>\n";
print "<form method=post action=checker.cgi>
print "<input type=name name=>ファイル名<br>
print "<input type=submit name=submit value=チェック>
print "<input type=hidden name=check value=check>\n";
print "</body>\n</html>\n";

if($check eq "check"){
open(FILE ,"$name");
@data = <FILE>;

eval{
foreach(@data){print;}  ///←ここは作成途中なのであしからず
};

091991803/06/06 17:00ID:???
if($@){
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n<title>文法エラーです</title>\n</head>\n";
print "<body>\n";
print "@data\n";
print "</body>\n</html>\n";
}
else{
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n<title>文法OKです</title>\n</head>\n";
print "<body>\n";
print "OKです。\n";
print "</body>\n</html>\n";
}}


ってすると、ボックスにファイル名入れた後、
表示されるのがはじめのと、ifの分岐後のとが複合してしまうんです。

___________
|     |
___________  ファイル名

チェック  Content-type: text/html OKです。

↑雑ですいませんが、こういうことです。

if($check eq "check")の下全部をifでかこって、
はじめの文法チェッカーのところをelseですればできるんですが、こんなかっこ悪いことしてるのがみあたりません。
html出力の重複を避けるにはどうしたらいいですか?
0920nobodyさん03/06/06 20:34ID:???
>>919
2つにわける。
0921nobodyさん03/06/06 20:43ID:???
凡例:
file_check.htmlの内容。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>文法チェッカー</title>
</head>
<body>
<form method="post" action="checker.cgi">
<input type="text" name="">ファイル名<br>
<input type="submit" name="submit" value="チェック">
<input type="hidden" name="check" value="check">
</body>
</html>
とする。
0922nobodyさん03/06/06 20:44ID:???
checker.cgiの内容。
#!/usr/bin/perl

require "cgi-lib.pl";
&ReadParse(*in);
$name = "$in{'name'}";
$check = "$in{'check'}";

if($check eq "check"){ open(FILE ,"$name"); @data = <FILE>;
eval{ foreach(@data){print;} } # ///←ここは作成途中なのであしからず
$html = <<"EOS";
Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>%s</title>
</head>
<body>
%s
</body>
</html>
EOS

if($@){ print sprintf($html,'文法エラーです',@data); }
else { print sprintf($html,'文法OKです','OKです。'); }
}
exit;
0923nobodyさん03/06/06 20:51ID:???
どうしても1つのファイルにしたいのなら、
method が GET のときは、921 を出力して終了。
method が POST のときは、922 を実行して終了。
になるように振り分ける。

・・・など。
0924nobodyさん03/06/06 21:26ID:???
なんでこのスレでCGIの質問するんだ?
うざいからCGIのスレ逝けよ
0925nobodyさん03/06/06 21:38ID:???
CGIでもコーディングの質問なら問題ない。
0926nobodyさん03/06/06 22:17ID:???
>>918
・まず、ほとんど同じコードを二度も三度も書くのはばかばかしいと思うようになろう。
・まとめられる部分はまとめるようにしよう。
・printとprintの間に他のコードが入っても、一向に問題にならない。
・content-typeは、そのCGIが最初に吐き出す文章であることが重要。二度も吐き出す必要はない。

てかさ。Perlとか云々以前にプログラミングそのものがわかってないような。
0927nobodyさん03/06/06 23:10ID:???
あのー、
テキストエリアにからのフォームデータ
$bodyを(もちろんReadParseして)

$body =~ s/(.*)\x0D\x0A$/(.*)\x0A$/g;
で、CR+LF→LFにならないんでしょうか?
実行するとこの行がエラーになるんですが・・・
0928nobodyさん03/06/06 23:20ID:???
>>925
「CGIの質問」はスレ違いだろ。何言ってんだ。
あとCGIのコーディングってなんだよ。
0929nobodyさん03/06/06 23:23ID:???
>>927
「エラーになるんですが・・・」じゃねーよバカ
エラー出てるんなら貼れ&>>1を100回声に出して読め。

$body =~ s/(.*)\x0D\x0A$/(.*)\x0A$/g;

$body =~ s/(.*)\x0D\x0A$/$1\x0A$/g;

$body =~ s/\x0D\x0A$/\x0A$/g;
0930nobodyさん03/06/06 23:24ID:???

$body =~ s/\x0D\x0A$/\x0A$/;
0931nobodyさん03/06/06 23:27ID:???
>>928
CGIとしてのPerlの質問であっても、コーディングに関してであれば問題ない。
って言いたかったの。
0932nobodyさん03/06/06 23:30ID:???
>>929
500エラーです。
チェッカーを見ると
Final $ should be \$ or $name at file.cgi line 111, within string
syntax error at file.cgi line 111, near "=~ s/(.*)\x0D\x0A$/(.*)\x0A$/g"
file.cgi had compilation errors.

0933nobodyさん03/06/06 23:34ID:???
>>931
了解

>>932
>>929-930の回答間違ってた。
$body =~ s/(.*)\x0D\x0A$/(.*)\x0A$/g;

$body =~ s/(.*)\x0D\x0A$/$1\x0A/g;

$body =~ s/\x0D\x0A$/\x0A/g;

$body =~ s/\x0D\x0A$/\x0A/;
0934nobodyさん03/06/06 23:38ID:???
>>933
うーん、できませんねぇ。
Win改行のままです。。。
0935nobodyさん03/06/06 23:41ID:???
>>932
置換後の文字列に正規表現書いてどうすんだ?
0936nobodyさん03/06/06 23:51ID:???
>>935
え?これでだめなんでしょうか?
ちなみに>>933の一番下のを試してもだめでした。
093793603/06/06 23:55ID:???
ぁ、$body =~ s/\x0D\x0A$/\n/;
これですんなりできたけどこれっていいの?
0938nobodyさん03/06/06 23:55ID:???
>934,>936
お前報告の仕方悪い。
エラーが出なくなったことをまず報告してから、その上で期待する結果が得られなかったと言いなさい。

で、改行コードを変換して、どこに出力しようとしてるのかな?
まさかSTDOUTに出力して、IEでソース見てたりしないよな?
0939nobodyさん03/06/06 23:57ID:???
>>937
Win改行かどうかってどうやって調べてんの?
094093603/06/06 23:59ID:???
ごめん、普通に考えれば
\x0D\x0A=\r\n
\x0D=\r
\x0A=\n
だね。。。。
マッチさせるときも、置き換え後も、
16進数のほうがいいんでしょうか?

>>938
>で、改行コードを変換して、どこに出力しようとしてるのかな?
>まさかSTDOUTに出力して、IEでソース見てたりしないよな?
ファイルに保存するツールなんです。
改行コードを書き換えてファイルに保存する、というところでひっかかってました
094193603/06/07 00:00ID:???
>>939
ファイルの行頭を抜き取って
if($file =~ /(.*)\x0D\x0A$/){$code = "CR+LF (Win)";}
elsif($file =~ /(.*)\x0A$/){$code = "LF (UNIX)";}
elsif($file =~ /(.*)\x0D$/){$code = "CR (Mac)";}
else{$code = "";}
とやってます。
0942nobodyさん03/06/07 00:00ID:???
ところで、ちゃんとLFになったかどうかのチェックはどうやってる?

あと「エラーがでます」「だめでした」などの曖昧な表現はやめよう。
「どういうエラーが出るのか」「どのようにだめだったのか」を必ず書くようにね。
0943nobodyさん03/06/07 00:01ID:???
>>940
> ごめん、普通に考えれば
> \x0D\x0A=\r\n
> \x0D=\r
> \x0A=\n
> だね。。。。
違う。\nはOSによって変わる。
\n = \x0D\x0A DOS,Win
\n = \x0D Mac
\n = \x0A etc.
094493603/06/07 00:01ID:???
>>942さん
>>941です。。
094593603/06/07 00:02ID:???
>>943
あ、そうなんですか。
では、改行コードの変換は16進数でしたほうがいいんですか??
0946nobodyさん03/06/07 00:06ID:???
こんなんか?

#!/usr/bin/perl
open(IN,"hoge");
binmode(IN);
$file = <IN>;
close(IN);

&code_check;
$file =~ s/\x0D\x0A/\x0A/g;
&code_check;

sub code_check {
if($file =~ /(.*)\x0D\x0A$/){$code = "CR+LF (Win)";}
elsif($file =~ /(.*)\x0A$/){$code = "LF (UNIX)";}
elsif($file =~ /(.*)\x0D$/){$code = "CR (Mac)";}
else{$code = "none";}
print "$code\n";
}

\x0D\x0Aの2バイトのファイル読み込ませたら、ちゃんと
CR+LF (Win)
LF (UNIX)
になったぞ。
094793603/06/07 00:10ID:???
>>946
わざわざつくっていただきありがとうございます。でも完成しました。。

ところで、友達も「改行コードはバイナリモードで解決した」
といってましたが、なぜバイナリモードで読むのでしょうか?
私が作ったのはバイナリにしないでも改行コード変換できましたよ?
0948nobodyさん03/06/07 00:11ID:???
>>947
お前バイナリモードの意味分かってないだろ?
取り敢えず検索する癖をつけろ。
094993603/06/07 00:12ID:???
#!/usr/bin/perl

require "./cgi-lib.pl";

&ReadParse(*in);
$name = "$in{'name'}";  ///フォームから受取ったファイル名
$body = "$in{'body'}";  ///フォームから受取った本文
$r_code = "$in{'r_code'}";  ///ラジオボタンで改行コードを選択


open(FILE,"> $name");

# 改行コードの変換
if($r_code eq "lf"){$body =~ s/\x0D\x0A$/\x0A/;}
elsif($r_code eq "cr"){$body =~ s/\x0D\x0A$/\x0D/;}

print(FILE $body);
close(FILE);

これでできたんですが、、、どうなんでしょうか
095093603/06/07 00:14ID:???
>>948
テキストモードって勝手にコードの変換がされるんですよね??
0951nobodyさん03/06/07 01:43ID:Y8iN/hYF
ふたつのファイルをrequireで呼び出すにはどうすればよいのですか?
require './data/data_1.cgi';
ひとつだけ呼び出すのは↑こんな感じになってました
data_1.cgiとdata_2.cgiのふたつを呼び出したいです
0952nobodyさん03/06/07 01:45ID:???
>>951
require './data/data_1.cgi';
require './data/data_2.cgi';
>>951の質問はこれにて終了しました。
↓次の方どうぞ
095393603/06/07 02:27ID:???
何度もすいませんが
ファイルの内容を
while( <FILE> ){print;}でテキストエリアに渡した場合は、Windows改行になるのでしょうか?
0954nobodyさん03/06/07 02:34ID:???
処理系依存かな
095593603/06/07 02:36ID:???
>>954
処理系依存、といいますと、クライアントのOSに影響するということですか?
0956nobodyさん03/06/07 02:50ID:???
>>955
そのスクリプトが実行されるOS。
どうような違いがあるかは、>>943を参照
095793603/06/07 02:54ID:???
>>956
そうですか。。。
Linuxの鯖なのに
if($r_code eq "lf"){$body =~ s/\x0D\x0A$/\x0A/;}
elsif($r_code eq "cr"){$body =~ s/\x0D\x0A$/\x0D/;}
で変換できているので、CR+LFで出力されていることになりますが、、、
UNIXはLFだと思ったんだけど、意外だ・・・・
0958nobodyさん03/06/07 06:18ID:???
>>953
そのファイルがどの環境で作られたのかによるんじゃない?
Windows環境で書いたファイルであれば、どこに持っていこうがCRLFのまま。
これをUNIX系環境で1行読み込んだ場合、LFの前のCRは「文字列の一部」として
そのまま読み込まれるだけだと思うんだが。

なんか、読み込んだ時点で自動的に変換されるとか、1行書き込むとUNIX環境では
自動的にLF改行になるとか、そんな感じに勘違いしてない?

それと、あなたの実行環境ってローカルで動かしてるサーバーだよね?
間違ってもレンタルサーバーとかプロバイダスペースじゃないよね?
なんか会話が噛みあってないから。
0959nobodyさん03/06/07 11:48ID:???
置換処理で困っています。

掲示板で(^-^)などの顔文字があればそれを画像にすりかえるために
IMGタグに置換しようとしていますが、あらかじめ配列に顔文字のリストを
入れて置換してもうまくいきません。

顔文字のリストは
@list = (
"(^-^)", "kao1.gif",
"(T-T)", "kao2.gif",
);

という感じで、実際に置換している部分は

for($i = 0; $i < @list + 0; $i+=2){
    $msg =~ s/($list[$i])/<IMG src=\"$list[$i+1]\" 〜略〜 alt=\"$list[$i]\">/g;
}

としています。まったく置換してくれません。
試しに顔文字のリストの顔の部分をOKなどにしてみると置換されました。
特殊な文字だから置換がうまくいかないのでしょうか?
どうすれば解決できるか教えてください、お願いします。
096093603/06/07 12:00ID:???
>>958
>なんか、読み込んだ時点で自動的に変換されるとか、1行書き込むとUNIX環境では
>自動的にLF改行になるとか、そんな感じに勘違いしてない?
へ?ぜんぜん思ってませんよ。。。
096193603/06/07 12:05ID:???
>>958

えと、つまり
Windows環境で、テキストエリアに入力した文字をcgiに送って
$body =~ s/\x0D\x0A$/\x0A/;
こうしても、LFにならないってことでしょうか?
0962nobodyさん03/06/07 12:36ID:???
>>959
顔文字が正規表現のメタ文字として解釈されているんでない?
顔文字のメタ文字を\でエスケープするか、もし面倒ならquotemetaであらかじめ
変換しておくとか。(\Q \Eって使えたかな…どなたか助言求む)
できればソースを書きたいんだけど、いま手元に実行環境がないんで勘弁して。
0963nobodyさん03/06/07 12:51ID:???
>>961
いい加減うぜぇ。2ちゃんは学校じゃねぇ。
質問等はまとめて話せ。少しは自分で調べて話せ。
>こうしても、LFにならないってことでしょうか?
やってみろバカ。プログラムに実験はつきものだ。
096493603/06/07 13:05ID:???
>>963
やってみました。
if($file =~ /(.*)\x0D\x0A$/){$code = "CR+LF (Win)";}
elsif($file =~ /(.*)\x0A$/){$code = "LF (UNIX)";}
elsif($file =~ /(.*)\x0D$/){$code = "CR (Mac)";}
こいつで正確に改行コードがえられるのかだけ教えてくれませんか?
0965nobodyさん03/06/07 13:10ID:???
>>964
それは何も変わらないだろ?チェックしてるだけだ。
もう質問は止めてPerlの超初心者本を読むことをお勧めする。
0966nobodyさん03/06/07 13:12ID:???
(´-`).。oO(やってみればぁ、、、)
レス数が950を超えています。1000を超えると書き込みができなくなります。