弐ch編集のPerl講座 (231レス)
上下前次1-新
1(5): 弐ch編集 02/02/15 07:25 ID:zi+qnSnN(1) AAS
なんか俺の偽者がいるから俺の本命Perlでたててみた。
とりあえず読み書きできるようにするか。
そうすりゃ自分で掲示板くらい組めるようになるだろうし。
2(2): 2 02/02/15 07:27 ID:oL67ZYlw(1) AAS
氏ね >>1
3: 弐ch編集 02/02/15 07:32 ID:??? AAS
#! /usr/local/bin/perl
print "Content-type: text/plain\n";
print "\n";
print "MegabbsXP!\n";
基本だな。
まずはヘッダを出力。とりあえずプレーンテキストだからtext/plain。
ヘッダと本文の間は一行空けるために改行を入れる。
じゃないとどこまでがヘッダか分からんから。
もちろんこれは"Content-type: text/plain\n\n"ってまとめてOK。
で次は本文を出力してるわけだ。画面にきちんとでれば成功。
4: 弐ch編集 02/02/15 07:44 ID:??? AAS
#! /usr/local/bin/perl
$text = 'MegabbsXP!';
print "Content-type: text/html\n\n"
print qq|<html><body text="#FF0000">$text</body></html>|;
exit;
次は$textに代入してHTML表示だ。HTMLだからtext/html。
printの次がqq||で囲まれてて変だろ。これはとりあえずqqという関数だと思ってくれ。
意味は「値を""で囲まれてるものとして扱う」かな。
なんでこんなめんどくさいことをするかっていうと、""のなかで"を使いたいから。
普通に"text="#FF0000""ってやったらどこが区切りだかわけ分からんからな。
こういう場合は"text=\"#FF0000\""とエスケープするのが普通だが
"を多用するHTMLでいちいちエスケープしてたら見にくいだろ?だから。
まあqq||なので|を使いたいときはエスケープしなくてはならないが…。
ちなみにqq~~とかqq()とかもできるぞ。
最後のexitはまんま終了な。前回書き忘れたが。
5: 名無しさん@お腹いっぱい。 02/02/15 07:50 ID:??? AAS
俺はお前の精神構造が理解出来ない
かまって欲しいのか、奉仕の快感を得たいのか
前に自分の板でやってたのと同じ主旨だろう?
正直、初めはお前の企画に期待してたんだが
最近ではウンザリだ
MEGABBS-XP、MEGABBSバグ無し版(現金徴収済)、二編perl講座
他にも企画倒れが有ったら教えてくれ
6: 弐ch編集 02/02/15 08:05 ID:??? AAS
open(IN, './log.dat') or &error;
@lines = <IN>;
close(IN);
これでファイルが読める。どうだ?Perlは俺と同じくらいすごいだろ?
openでファイルハンドルINとファイルを結びつける。
openは失敗すると偽を返す。そうするとorが反応して&errorが呼ばれる。
&errorはてきとうなエラー表示関数な。or dieとしてdie関数を呼んでもいいが、
掲示板なら「ファイルが開けませんでした」とか表示したいだろ?
だからわざわざエラー表示関数を呼ぶ。
で@lines。ファイルの改行までをひとつのデータとみて
どんどん配列にぶちこまれるってわけだ。
そしてクローズ。これでINとファイルはきれいに手を切ることができる。
ところで、この方法にはいろいろ問題がある。配列にファイルの全データが
読み込まれる点だ。極端な話、ファイルが500MBあったらそれが全部配列に
代入されちまう。メモリ上に500MB読み込まれるってわけ。お前のパソコン
メモリ何MB?64MB?即死だな。お前が一人で勝手に死ぬのはかまわんが、
サーバー上にはお前以外の人も住んでいるから、その人たちも迷惑をこうむる。
最悪だな。そんなんじゃお前は俺と同類だぞ?ようこそMegabbsへ。
じゃあどうすればいいのかっていうと、次。
7: 弐ch編集 02/02/15 08:19 ID:??? AAS
open(IN, './log.dat') or die;
while($line = <IN>) {
print $line;
}
close(IN);
$line=<IN>で$lineに改行まで一行だけ読み込まれるから
whileでぐるぐる回して好きな処理をするわけだ。
つまり<IN>が全部返すが一行返すか
自分の相手をみて勝手にやってくれてるようなもんだ。
この「相手が変数か配列か」っていうのはPerlでは結構重要な部分だと
俺は個人的には思っている。だからお前も思え。
話を戻すが、これなら一行づつだからメモリも安泰なわけだ。
6で俺が書いたお前のパソコンうんぬんっつーのは、ローカルでやるならOKってこと。
お前がお前のパソコンで@lines=<IN>するのは問題ない。お前が死ぬだけだし。
だが鯖上には他の人もいるからやめろってこと。
だから例えば少しのデータをお前がローカルで処理したい時は
@lines=<IN>の方が簡単だからそれでいいじゃん、と。頭は使いようだぞ?
8: 弐ch編集 02/02/15 08:22 ID:??? AAS
ゴメン、やっぱり飽きたからやめるよ (=´Д`=) じゃっ
9: 弐ch編集 02/02/15 08:36 ID:??? AAS
open(OUT, "> ./log.dat") or die;
print OUT "MegabbsXP!\n";
close(OUT);
書き込み。>は上書きの記号だ。覚えろ。
print OUTもなんとなく分かるだろ?OUTに書き込むって意味。
で、クローズ。終わり。
注意すべきは>は上書きだということ。openは最初にファイルを
空にして、それからファイルハンドルとくっつけるイメージだ。
だからor dieの時、つまりopenが失敗した時には
ファイルは空、しかも書き込みもできずっていう最悪パターンだ。
常套手段としてはこれ。
$tmp = './log.tmp'; $file = './log.dat';
open(OUT, "> $tmp") or die;
print OUT "MegabbsXP!\n";
close(OUT);
chmod(0600, $tmp);
rename($tmp, $file);
テンポラリに書きだして、それが成功したのを見届けてからリネーム。
これならopenに失敗してもlog.datは生きてる。無関係だから。
ちなみにrenameも失敗する時があるのだが…まあそれは自分でorしてくれ。
chmodは宿題。自分で調べろ。
上下前次1-新書関写板覧索設栞歴
あと 222 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.017s