弐ch編集のPerl講座 (231レス)
弐ch編集のPerl講座 http://medaka.5ch.net/test/read.cgi/php/1013725517/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
1: 弐ch編集 [] 02/02/15 07:25 ID:zi+qnSnN なんか俺の偽者がいるから俺の本命Perlでたててみた。 とりあえず読み書きできるようにするか。 そうすりゃ自分で掲示板くらい組めるようになるだろうし。 http://medaka.5ch.net/test/read.cgi/php/1013725517/1
2: 2 [] 02/02/15 07:27 ID:oL67ZYlw 氏ね >>1 http://medaka.5ch.net/test/read.cgi/php/1013725517/2
3: 弐ch編集 [sage] 02/02/15 07:32 ID:??? #! /usr/local/bin/perl print "Content-type: text/plain\n"; print "\n"; print "MegabbsXP!\n"; 基本だな。 まずはヘッダを出力。とりあえずプレーンテキストだからtext/plain。 ヘッダと本文の間は一行空けるために改行を入れる。 じゃないとどこまでがヘッダか分からんから。 もちろんこれは"Content-type: text/plain\n\n"ってまとめてOK。 で次は本文を出力してるわけだ。画面にきちんとでれば成功。 http://medaka.5ch.net/test/read.cgi/php/1013725517/3
4: 弐ch編集 [sage] 02/02/15 07:44 ID:??? #! /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はまんま終了な。前回書き忘れたが。 http://medaka.5ch.net/test/read.cgi/php/1013725517/4
5: 名無しさん@お腹いっぱい。 [sage] 02/02/15 07:50 ID:??? 俺はお前の精神構造が理解出来ない かまって欲しいのか、奉仕の快感を得たいのか 前に自分の板でやってたのと同じ主旨だろう? 正直、初めはお前の企画に期待してたんだが 最近ではウンザリだ MEGABBS-XP、MEGABBSバグ無し版(現金徴収済)、二編perl講座 他にも企画倒れが有ったら教えてくれ http://medaka.5ch.net/test/read.cgi/php/1013725517/5
6: 弐ch編集 [sage] 02/02/15 08:05 ID:??? 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へ。 じゃあどうすればいいのかっていうと、次。 http://medaka.5ch.net/test/read.cgi/php/1013725517/6
7: 弐ch編集 [sage] 02/02/15 08:19 ID:??? 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>の方が簡単だからそれでいいじゃん、と。頭は使いようだぞ? http://medaka.5ch.net/test/read.cgi/php/1013725517/7
8: 弐ch編集 [sage] 02/02/15 08:22 ID:??? ゴメン、やっぱり飽きたからやめるよ (=´Д`=) じゃっ http://medaka.5ch.net/test/read.cgi/php/1013725517/8
9: 弐ch編集 [sage] 02/02/15 08:36 ID:??? 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は宿題。自分で調べろ。 http://medaka.5ch.net/test/read.cgi/php/1013725517/9
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 222 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.004s