トップページperl
188コメント45KB

明日のタメに その1 (Perl使いへの道)

■ このスレッドは過去ログ倉庫に格納されています
0001ぴょん基地NGNG
明日のタメに その1 (Perl使いへの道)
ということで、一番シンプルな Perl で書いた CGI を
まったくの初心者でも、動かせるようになるように・・・
最初の難関がこれだと思うし、最大の難関でもあると思う。

#!/usr/bin/perl
print "Content-type: text/plain\n\n" ;
print "2チャンネル";
exit;

あなたは、これを動かせますか? (つまずいたら、質問してネ)
0037名無しさんNGNG
ファイル読み込み時のエラー処理をしたいのですが
open (LOG, "$hoge") || die "Errorですよお客さん :$!\n";

で試した場合、Errorですよお客さんが表示されずに500エラーになってしまいます。
どこか他にもおかしいところがあるのでしょうか?
0038>37NGNG
CGI ですよね。die は STDERR に出力するので、ブラウザなどの呼び出し側には
何も返らず、エラーになります。

open( LOG, "$hoge" ) || &error( 'Errorですよお客さん' );

sub error{
  my $msg = shift;
  print "Content-Type:text/html\n\n";
  print "<html><body>$msg</body></html>";

  exit;
}

こんな感じにします。
0039ぴょん基地NGNG
その shift というのは、どういう意味なんですか ? > 38
$_[0] と同じ意味なんですか ?
0040トルエン監督NGNG
>39
shiftっていうのはね、関数のひとつで一試合で3ゴール決めた時の事を言いますが?
0041名無しさんNGNG
>39
引数(?)を省くと、(サブルーチンの中では) @_ の先頭から1要素取り出します。
@_ の先頭が無くなる以外、$_[0] と同じです。
0042ぴょん基地NGNG
ぬあーるほど、 > 40,41
Perl には、いろいろな関数があるんですね〜。
0043名無しさんNGNG
print <<END_OF_DATA;
Content-Type:text/html

<html><body>$msg</body></html>
END_OF_DATA

って方が、"を\"って書いたりしなくていいし、
出力イメージっぽく書けるので好きなのですが、邪道?
004438NGNG
>43
あ、単に私がいろいろ無知ないんで、いちおうなんです。

HTTPヘッダ(?)のあとには「空行を入れる」らしいですけど、
43さんのように書くと、たとえば Windows で書いたときに
Content-Type: text/html\r\n
\r\n
<html>...

となって、Mac とか UNIXでは空行と判定されないんじゃないか、とか…。
ここらへん詳しい方、教えてくれると嬉しいです。
0045ぴょん基地NGNG
わたしの場合は、1行目だけ明示的に \n\n を入れています。
あとで修正等行うときの事故予防と考えています。

print "Content-Type:text/html\n\n";
print <<EOF;
<HTML><BODY>
あげ
</BODY></HTML>
EOF

0046名無しさんNGNG
>44
大抵の人はサーバへFTP転送でしょうから、ASCII転送だし問題なし
だとおもう。Win->UnixでASCII転送しないと動かないよね?

でもさ、プロトコル的にはヘッダと本体のセパレータは2つの連続
したCRLFで区切られるって定義されてるはずだから、それをさらに
Webサーバが\r\nに変換してるんだろうね。
っつーのは「明日のタメに」とかに書くネタじゃないね。ごめん。
0047NGNG
借り物のperlスクリプトは使ってましたが、一から勉強中です。

まずは、こんな簡単なスクリプトを書いてみて、成功しました。
http://thunder.prohosting.com/%7Eysc/cgi-bin/test/first_cgi.txt
http://thunder.prohosting.com/%7Eysc/cgi-bin/test/first.cgi

で、次に、time関数を使ったこんなスクリプトを書いてみたんですが、動きません。
http://thunder.prohosting.com/%7Eysc/cgi-bin/test/date_cgi.txt
http://thunder.prohosting.com/%7Eysc/cgi-bin/test/date.cgi

「CGI入門講座」(オーム社)という本に掲載されているモノをそのまま打ち込んだんですが。
testディレクトリ及びCGIのパーミッションは705、転送はアスキーモードです。

何故動かないのでしょうか?ご教授お願いします。
0048名無しさんNGNG
多分
print "$year/$man/$mday $hour:$min:$sec\n";
ここの行が失敗だと思うよ
print "$year\/$man\/$mday $hour:$min:$sec\n";
"/"使うときは"\"でエスケープしといたほうが無難
それと記述ミスっぽいけど$manってのは定義してないから
$monにしとけ
あとは
($sec,$min,$hour,$mday,$mon,&year,$wday,$yday,$isdst) = localtime(time);
ここの&yearを$yearに直すとか
0049名無しさんNGNG
3行目の &year が原因。
人に聞く前に perl -cw date.cgi でチェックしてくれ。
0050ぴょん基地NGNG
$year += 1900 ; もやっておいたほうが良いと思うぞ
y3k 対策として、
0051NGNG
>48さん、49さん、ぴょん基地さん ありがとうございます。
……ケアレスミスでしたね。大変申し訳ありませんでした。
上手くいきましたです。
http://thunder.prohosting.com/%7Eysc/cgi-bin/test/date_cgi.txt
http://thunder.prohosting.com/%7Eysc/cgi-bin/test/date.cgi
0052dustNGNG
せっかくよいスレッドなので、一度あげておきます。
0053名無しさんNGNG
age
結局初心者に対しては1だけじゃん、、続きお願いします
0054名無しさんNGNG
ていうか、他の言語のプログラミング経験者でないと、Perlの良さって分からなくない?
CGIがPerl標準だから使ってるだけだろ?
0055名無しさんNGNG
ついでに、自分がよくやるのは

>#!/usr/bin/perl
じゃなく、普通に#!/usr/local/bin/perlのままじゃ自分家のLinuxで動かんかった。
samba経由でファイルコピーしたらCRLFがそのまんまで動かんかった。
suExecにしたらotherの書き込み権限で動かんかった。
同じくファイルの所有権がwheelグループだったら動かんかった。

こいうのが多いが、しょっちゅうやってしまうので頭が痛い。
0056名無しさんNGNG
Perl4 でも Perl5 でも
#!/usr/bin/perl
この部分は、同じなんですか?
0057名無しさんNGNG
>56
サーバによって違う。
普通は #!/usr/local/bin/perl か #!/usr/bin/perl のどちらか。
基本的に perl がインストールされているパスを書く。
telnet が使えれば which perl で出てくるのでそれを書くのだが、
フリーのとこならたいてい CGI の説明のとこに書いてあるので
よく読むべし。

0058名無しさんNGNG
たまに -w とかついてるのは、なぜなんだろう?
なにか おまじない ?
0059名無しさんNGNG
デバック用とか、、、
0060名無しさんNGNG
>58
59 のいうとおりデバッグ用です。
具体的には、コマンドラインから perl と打って起動するときに指定するオプションを、
シェルが perl を起動するときに付ける場合ここに書くことになります。
-w は詳細なエラーメッセージの出力ですが
普通 CGI がエラーになると Internal Server Error になって
エラーメッセージは表示されないので無意味です。
0061名無しさんNGNG
ありがとうございます。
0062名無しさんNGNG
Content-type: text/html

Content-type: text/plain
ではどのような違いがあるのでしょうか?
0063名無しさんNGNG
text/plain だと、タグがそのまま表示される。整形してくれない。
つーか、聞く前にやってみろ。
0064名無しさんNGNG
htmlの
<body bgcolor="#FFFFFF" onload="setInterval('scroll()',200)">
をCGIで出力させたくて
print "<BODY bgcolor='#FFFFFF' onload='setInterval('scroll()',200)'>\n";
とやってみたんですけど、うまくいきません。。
たぶん onload="〜"をonload='〜'に直してるからだと思うんですが、
こういう場合どうしたらいいでしょうか??
0065japuNGNG
print qq[<body bgcolor="#FFFFFF" onload="setInterval('scroll()',200)">];
or
print "<body bgcolor=\"#FFFFFF\" onload=\"setInterval('scroll()',200)\">";
0066名無しさんNGNG
print qq{<body bgcolor="#FFFFFF" onload="setInterval('scroll()',200)">\n};
0067名無しさんNGNG
かぶった(TT
006864NGNG
>65,66さん
早速ありがとうございました。動きました。

このインターネット時代に掲示板で教えてもらわないと、ものを調べられないというのは致命的だなぁと思う今日この頃でした。
マニュアルとかも読めないし。。。ギャフンッ!
0069japuNGNG
とりあえず『プログラミングPerl (改訂版)』を買っておくのが吉。
(英語版はそろそろ3版出るけど。)
0070初心者です。。NGNG
自分のHPに来て頂いた方が、どちらから来たのか知りたいと
思って以下の様なプログラムを作ってみました。
でも、ぜんぜん上手くいかないのです。
『500 Internal Server Error』なってしまいます。
どなたか、どこがどういけないのか教えて下さい。
ヨロシクお願いします。

#!/usr/local/bin/perl
#アクセスログ取得
#
#
open(FILE, "hoge.dat");
@allbody = <FILE>;
close(FILE);
$tmp = $ENV{'HTTP_referer'};
unshift (@allbody, $tmp);
open(FILE, ">hoge.dat");
print FILE @allbody;
close(FILE);
exit;
007162NGNG
ごめんなさい。逝きます。。
0072>70NGNG
hoge.dat は先に作って 0666 にしてる?
0073初心者です。。 NGNG
はい、してます。
007472NGNG
これ、どうやって呼んでるの?
SSIならいいけど、直接呼んでるならHTM出力してないから
エラーになるけど。(あ、SSIでもヘッダ出さないと駄目だな)
あと、HTTP_REFERER ってやんないと拾えないと思う。
ファイルはアペンドモードにすれば全部読む必要は無いよ
007572NGNG
>SSIでもヘッダ出さないと駄目だな
#exec cmd ならヘッダいらないけどね
0076初心者です。。NGNG
直接呼び出してます。
これが原因でしたか。
どこから来たのかファイルへ書き込みたいと思ったのですが、
HTMへ表示させようとは思ってなかったのです。。。
しかし、何を表示すればいいのやら。
HTTP_REFERER はダメダメですね。ケアレスミスでした。
72さんホントにありがとうございます。
今すぐ試してみます。
0077初心者です。。NGNG
>72さん
ファイルにちゃんと書き込んでくれました。
ありがとうございます♪

0078名無しさんNGNG
ぴょん基地さん、その2は無いんですか?
0079トリニティー、ヘルプ!!NGNG
Winで1を試したいんだけど、どうしたらCGIが使えるようになるの?
パールは入ってます。
0080トリニティー、ヘルプ!!NGNG
無料で、インストールが簡単なのない?
0081名無しさんNGNG
>79,80
AN HTTP Server
http://www.st.rim.or.jp/~nakata/
を入れるのがいいっす。無料。
0082トリニティー、ヘルプ!!NGNG
どうもっす。やってみます。
0083名無しさんNGNG

質問するときは自分でスレッドを立てて質問しなさい。そうしないと
この板が寂れます。スレッドを立てると活気付きます

-----------------------完------------------------

0084名無しさんNGNG
寂れる理由は違うと思うけど ?? >>83
0085名無しさんNGNG
2ちゃんるるは、情報の交換場所だからね、、、
0086名無しさんNGNG
print "$str" と print $str は
何か違いがあるのでしょうか…
ご教授頂ければ幸いです。
0087>86NGNG
スレッド立てて質問しなさい


-----------------------完------------------------
0088>86NGNG
そもそもあなた、なんでこのスレッドに書いてるの?あんな題名だからって
ここに書くのは失礼です。
008986NGNG
> 87,88
やたらめったらスレッドを建てるのが良いとは
とても思えないので(ましてやあの内容で)、
簡単な質問が過去にも為されているこのスレッドで質問しまスた。
0090>83NGNG
こんなのはたてて欲しくないな。
http://tako.2ch.net/test/read.cgi?bbs=perl&key=962312787
0091名無しさんNGNG
http://mentai.2ch.net/test/read.cgi?bbs=prog&key=957778266
http://www.2ch.net/test/read.cgi?bbs=unix&key=960842615
同じバカがいろんな所で繰り返してるぞ。
レスを全部読む方法を知らないらしい。
0092名無しさんNGNG
AN HTTP Server
http://www.st.rim.or.jp/~nakata/
使い方意味不明。他に無い?
0093名無しさんNGNG
それより面倒なのならいっぱいあるけど。
0094名無しさんNGNG
>92 はぁ?どっかきえなさい
0095>92NGNG
あ、それね。ドリームキャスト用じゃないんだよ。
0096>92NGNG
異様に簡単でないかい?
0097>92NGNG
http://www.apache.org/
変わり
0098>92NGNG
http://www.apache.org/
代わり
0099>92NGNG
http://www.microsoft.com/JAPAN/win95/modules/psw.htm
終わり
0100名無しさんNGNG
半径12.5センチの円の円周を求めるプログラムを書きましょう(藁
0101>100NGNG
円の円周って、どうやって求めるんだっけ?(藁
いや、マジで忘れたのよ(藁
0102できた!!NGNG
3.1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 5923078164
 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 5058223172
 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 4428810975
 6659334461 2847564823 3786783165 2712019091 4564856692 3460348610 4543266482
 1339360726 0249141273 7245870066 0631558817 4881520920 9628292540 9171536436
 7892590360 0113305305 4882046652 1384146951 9415116094 3305727036 5759591953
 0921861173 8193261179 3105118548 0744623799 6274956735 1885752724 8912279381
 8301194912 9833673362 4406566430 8602139494 6395224737 1907021798 6094370277
 0539217176 2931767523 8467481846 7669405132 0005681271 4526356082 7785771342
 7577896091 7363717872 1468440901 2249534301 4654958537 1050792279 6892589235
 4201995611 2129021960 8640344181 5981362977 4771309960 5187072113 4999999837
 2978049951 0597317328 1609631859 5024459455 3469083026 4252230825 3344685035
 2619311881 7101000313 7838752886 5875332083 8142061717 7669147303 5982534904
 2875546873 1159562863 8823537875 9375195778 1857780532 1712268066 1300192787
 6611195909 2164201989 3809525720 1065485863 2788659361 5338182796 8230301952
 0353018529 6899577362 2599413891 2497217752 8347913151 5574857242 4541506959
 5082953311 6861727855 8890750983 8175463746 4939319255 0604009277 0167113900
 9848824012 8583616035 6370766010 4710181942 9555961989 4676783744 9448255379
 7747268471 0404753464 6208046684 2590694912 9331367702 8989152104 7521620569
 6602405803 8150193511 2533824300 3558764024 7496473263 9141992726 0426992279
 6782354781 6360093417 2164121992 4586315030 2861829745 5570674983 8505494588
 5869269956 9092721079 7509302955 3211653449 8720275596 0236480665 4991198818
 3479775356 6369807426 5425278625 5181841757 4672890977 7727938000 8164706001
 6145249192 1732172147 7235014144 1973568548 1613611573 5255213347 5741849468
 4385233239 0739414333 4547762416 8625189835 6948556209 9219222184 2725502542
 5688767179 0494601653 4668049886 2723279178 6085784383 8279679766 8145410095
 3883786360 9506800642 2512520511 7392984896 0841284886 2694560424 1965285022
 2106611863 0674427862 2039194945 0471237137 8696095636 4371917287 4677646575
 7396241389 0865832645 9958133904 7802759009 9465764078 9512694683 9835259570
 9825822620 5224894077 2671947826 8482601476 9909026401 3639443745 5305068203
 4962524517 4939965143 1429809190 6592509372 2169646151 5709858387 4105978859
 5977297549 8930161753 9284681382 6868386894 2774155991 8559252459 5395943104
 9972524680 8459872736 4469584865 3836736222 6260991246 0805124388 4390451244
 1365497627 8079771569 1435997700 1296160894 4169486855 5848406353 4220722258
 2848864815 8456028506 0168427394 5226746767 8895252138 5225499546 6672782398
 6456596116 3548862305 7745649803 5593634568 1743241125 1507606947 9451096596
 0940252288 7971089314 5669136867 2287489405 6010150330 8617928680 9208747609
 1782493858 9009714909 6759852613 6554978189 3129784821 6829989487 2265880485
 7564014270 4775551323 7964145152 3746234364 5428584447 9526586782 1051141354
 7357395231 1342716610 2135969536 2314429524 8493718711 0145765403 5902799344
 0374200731 0578539062 1983874478 0847848968 3321445713 8687519435
0103名無しさんNGNG
それは円周率。
0104名無しさんNGNG
>102
すーぱーぱいの結果なんて書き込むな。
0105ラプNGNG
今日、参考書を買いに行こうって思ってます。

69で、japuさんが
>とりあえず『プログラミングPerl (改訂版)』を買っておくのが吉

と言っておりますが、こちらは何処から出版されてるのでしょうか?
その他に、お勧めの本が有るようでしたら
見比べたいので、教えて下さい。
宜しくお願いします。
0106名無しさんNGNG
これかな?
http://www.oreilly.co.jp/BOOK/
0107ラプNGNG
>106
ありがとうございます。
らくだ本というヤツも、これと同じだったのですネ。
さっそく買いに行ってきます。
0108japuNGNG
なお、ある程度英語が読めるのであれば、
Programming Perl, 3rd Edition
http://www.oreilly.com/catalog/pperl3/
を買うのも良いかと。これは Perl 5.6 に対応した内容です。(改訂版は 5.003 に対応。)
0109ぴょん基地NGNG
おらも、おらいりーで勉強しただす。
0110名無しさんNGNG
プログラミングパールと一緒にEffective Perl読んどくといいっす。
0111オイラもオイラもNGNG
郊外型の書店へ逝ってみた。
CやJAVAのコーナーは有ったのにPerlは無し。
そんなものなんですかね。
KENTと作ろうは有ったけど……。
0112既出かもNGNG
プログラミングPerl 改訂版
発売元:オーム社
ISBN-900900-48-6
\4900+税
0113名無しさんNGNG
ホント、、perlの書籍は少ない。。。
俺が住んでるのが田舎ってのもあるんだろうけど(藁
0114名無しさんNGNG
>113
いっぱいあるよ、、、
0115ラプNGNG
>108以降ALL

ホントありがとうございました
ちなみに、英語はいまいちです
0116名無しさんNGNG
本当の初心者は初めてのPerlからやったほうがいいと思うが
0117名無しさんNGNG
>>113
なんか分かるような気がする。
うちは名古屋の中区だけど、名古屋でも豊富にある書店は数えるほどしかない。
UNIX関係は図書館が大きいから助かってるけど。
地方の書店にある本なんてほんと限られてるから。
0118名無しさんNGNG
CGI作りたくてちょっと使えるようになりたいんなら
技術評論社 CGIのための実践入門Perl ってのもいいかも。
ISBN4-7741-0629-1 (C3055) ¥2880E
0119名無しさんNGNG
すぐわかるperl(深沢千尋・著、技術評論社)
も1から始める人にはお勧め。
後はリファレンス本が1冊あればよし。
0120119NGNG
↑プログラミングやった事ない人でも分かる内容になってます。
0121>120NGNG
プログラムやったこと無い人です。
正規表現の所でくじけました。。
0122名無しさんNGNG
正規表現って本だとなかなかわかりずらいよね。
例をたくさんのせてもらいたい。
0123120>121NGNG
がんばれ。

#$num='test';
$num=2;

if($num !~ /\d/){
print '数字じゃないよ';
}else{
print '数字です';
}

こんな感じ。#これくらいは分かるか(^^;
0124120NGNG
ごめん、間違ってた。
これだと数字が入ってたら、になる。
鬱だ氏のう。

if($num =~ /\D/){
print '数字じゃないよ';
}else{
print '数字です';
}
0125名無しさんNGNG
空白入れろ。
0126>125NGNG
124じゃないけど、TAB入ってるよ。
君のとこのブラウザは空白やTABは消えちゃうのかい?
って、ふつーそうか
0127名無しさんNGNG
あげ^^
0128正規表現といえば、NGNG
オライリーの『詳説 正規表現』以外で良い本ありませんか?

↑は高いのに、近郊の本屋には置いて無くて
 中身チェック出来ないので。
 それとも、チェック出来ずとも買い。でしょうか?
0129名無しさんNGNG
何か適当な Perl のリファレンス本で十分では?
0130名無しさんNGNG
man perlre の和訳を探してきて読むといいです。
0131名無しさんNGNG
manくらい英語で読め
0132名無しさんNGNG
>131
んにゃ。みんな英語で読めたんじゃ、わたしの商売あがったりです。
0133名無しさんNGNG
商売age
0134名無しさんNGNG
「みんな英語で読めるようになる」本書いて。
売れないかもしんないけど(爆)。
0135名無しさんNGNG
それって英語の本じゃないの(ワラ
0136japuNGNG
『詳説 正規表現』は正規表現を究めようとするなら買い、です。
あとは、『Effective Perl』もオススメ。(こっちは正規表現だけじゃないけど。)
0137名無しさんNGNG
>135
じゃあその本を1冊だけ翻訳だ!

■ このスレッドは過去ログ倉庫に格納されています