【Perl 】初心者コーナーPart8
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
01/10/24 14:11ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://ebi.2ch.net/test/read.cgi/php/988809842/l50
CGIの質問はこちら【CGIだけど、なんか質問ある?part4】
http://ebi.2ch.net/test/read.cgi/php/1000804655/l50
過去ログ、その他の役立ち情報は>>2-10を見よう。
0021_gunzip
01/10/25 04:37ID:???脱出時のlocal変数のsavestackからのrestoreなどを処理する
クリーンアップコードが必要になるからです。
...とは言え、気にする程のオーバーへッドではありません。
0022_gunzip
01/10/25 04:39ID:???0023名無しさん@お腹いっぱい。
01/10/25 06:43ID:???こりゃこりゃこりゃこりゃこりゃこりゃ
0024前スレの911
01/10/25 09:25ID:MgH0xJgHurlもdiary.cgiのままです。
0025名無しさん@お腹いっぱい。
01/10/25 09:47ID:???せめて前スレの該当記事のトコのURL書いとけよ。
エラー処理のトコで入力されたパスワードと正確なパスワードを表示するようにして
ちゃんと同じパスワードが渡ってるか確認しろ。
てゆーか
http://ebi.2ch.net/test/read.cgi/php/1000267444/937
で既に指摘されてるだろ?
結果はどうなったんだよ。
0027今日からPerlさん
01/10/25 10:50ID:GGoket9P----------
$Old_Dir = './old';
$New_Dir = './new';
$File_Name = 'sample.html';
$Old_File = $Old_Dir + $File_Name;
$New_File = $New_Dir + $File_Name;
rename($Old_File,$New_File);
----------
これでは./old/sample.htmlが./new/sample.htmlに移動してくれません
どうしたらよいのでしょうか
0028名無しさん@お腹いっぱい。
01/10/25 11:07ID:???まず、+ では文字列の連結は出来ないよ。
文字列の連結はピリオドなので、やるなら
$Old_File = $Old_Dir . $File_Name;
でも、これじゃ出来ない。
$Old_File がどういう値になるか考えてみて。
0029名無しさん@お腹いっぱい。
01/10/25 11:09ID:???0030名無しさん@お腹いっぱい。
01/10/25 11:17ID:???0031名無しさん@お腹いっぱい。
01/10/25 11:40ID:???あと、その場合 $Old_Dir と $New_Dir がそれぞれ
'./old/' './new/' でなくてはなりませんね。
そのままでは './oldsample.html' みたいになってしまいます。
003228
01/10/25 11:49ID:o7msDzki言わずにちょっとだけ考える余地を残しておいたのに・・・
0034>>17 こちらのほうが…
01/10/25 13:02ID:???$name eq 'tinko pinpin' and ++$cnt
0035煽ってるわけじゃないですが
01/10/25 14:26ID:???0036名無しさん@お腹いっぱい。
01/10/25 15:09ID:???漢ならそんな事気にすんなよ な!
コンパイラ如きで最適化されてるうちは素人って事よ
がはははは!!!! はぁ....
0037名無しさん@お腹いっぱい。
01/10/25 16:32ID:???何を指して言っているのかわからん。
0038名無しさん@お腹いっぱい。
01/10/25 17:00ID:???0039名無しさん@お腹いっぱい。
01/10/25 17:35ID:???0040名無しさん@お腹いっぱい。
01/10/25 18:32ID:o6v/hYdrDBMってレコードの数が多いと、オープンしたときにそれなりのメモリを消費するのでしょうか?
0041名無しさん@お腹いっぱい。
01/10/25 18:56ID:???実際はデータが全てメモリに展開されることは無かったかと。
使い方によってはメモリ食うだろうし、データが多くなればなるほど
重くなるのはどんなシステムでも同じですが。
0042今日からPerlさん
01/10/25 19:50ID:YIAkhk5x0043名無しさん@お腹いっぱい。
01/10/25 19:58ID:???答え出てます。
>>28、>>31
0044JAPU ◆JAPUTeX.
01/10/25 20:08ID:???何が分からないの?
単に正解だけを求めるのは良くないよ。
----
ちなみに、http://www.japu.org/cgi/security/ は既に移転しています。
(ジャンプするようにしてあるけど。)
0045名無しさん@お腹いっぱい。
01/10/25 20:39ID:???アハハハh アホカ
0046名無しさん@お腹いっぱい。
01/10/25 21:06ID:???0047名無しさん@お腹いっぱい。
01/10/25 21:18ID:???004827の母
01/10/25 21:23ID:???本当に27=42だか知らんが、オナニスト先生は正解も書いてちょんまげ〜
004940
01/10/25 21:36ID:o6v/hYdrハッシュに入れてるのでメモリを食ってるのかと思ってました。
ありがとうございました。
0051名無しさん@お腹いっぱい。
01/10/26 05:34ID:yrZd+AXW.htmlファイルにあるフォームに内容を書いて投稿すると.cgiファイルに渡して
処理をし、表示させるというものはどうにか作ることが出来ました。
しかし色々な方が作っている掲示板の中には投稿フォームの表示から書き込まれ
た内容の処理、それらの表示までを.cgiファイルだけでほとんど全ての処理を行
うものがあります。次はこういうスクリプトを作りたいのですが、どうしてもう
まく行きません。
既にログファイルに書き込まれている内容を投稿フォームの下に表示することと
投稿した内容をログファイルに書き込むことはできるのですが、書き込み→処理
→表示ができません。つまり、投稿した内容はリロードしないと読むことが出来
ないのです。
ただ上の動作をさせたいためだけに作ろうとしたスクリプトとはいえ、仕上って
みるとやたらに『</body></html>』の多いものになってしまいました。今までは
どんなに頑張ってもできなかったのに、ここに載せるために書いたものが偶然そ
ういうものになったという棚ボタスクリプトのため、効率も何もあったものでは
なく・・・。
ここに載せるにはあまりにも長いため、別サイトに置くことにしました。
http://www.geocities.co.jp/Outdoors-River/5665/sample.txt
よろしくお願いします。
ここにある簡単なBBSのスクリプトをダウンロードしてから処理の流れ見て
みましょう。
デバッグの方法がわからないなら、
sub debug_print {
print "Content-Type: text/plain\n\n";
foreach (@_) { print "$_," }
exit;
}
でも使って1行ずつわからない変数があれば目で見て調べましょう
0053名無しさん@お腹いっぱい。
01/10/26 07:36ID:???そのソースのまま順番を変えたら表示出来たよ。
$ENV{"CONTENT_LENGTH"}空なら書き込み処理はいらないよね。
0054名無しさん@お腹いっぱい。
01/10/26 13:12ID:???&log_viewer; # ログ展開して記事表示
&get_time; # 日時取得して
&decord; # フォームデコードして
&data_write; # ログに書き込み。
>>52さんの言うように
他の配布スクリプトの処理の流れを見て、
BBSがどういう処理をすれば動くのか考えてみるといいかも。
&decord; # フォームデコードして
&get_time; # 日時取得して
&data_write; # ログに書き込み。
⊤ # 投稿フォームを表示して
&log_viewer; # ログ展開して記事表示
0055名無しさん@お腹いっぱい。
01/10/26 15:10ID:LxO4xBRISchedule::Cronを使おうかと考えていますが、実行プログラムをエントリーすることは
できても削除することはできません。
(全部削除することはできる)
cronを自由自在に操るライブラリもしくはcron likeなプログラムってありませんか?
0056名無しさん@お腹いっぱい。
01/10/26 18:06ID:YTmtLQJfPerlでCGIを書いてるプログラミング初心者です。
いきなりですが、
ローカルで動いたCGIがアップすると動かない場合、
どんなミスが考えられるでしょうか。
パスはあってます。
パーミッションもあってます。
これ意外でなにか思い当たることがあれば教えていただけませんか?
よろしくお願いします。
0057名無しさん@お腹いっぱい。
01/10/26 18:14ID:???エラーになる原因はいくらでもあります・・
httpdのエラーログ見ましょう。
005856
01/10/26 19:14ID:YTmtLQJfすみません、httpdって何ですか?
0059名無しさん@お腹いっぱい。
01/10/26 19:23ID:???0060名無しさん@お腹いっぱい。
01/10/26 19:58ID:DV5PQduC貴様が馬鹿だ。
006156
01/10/26 20:22ID:YTmtLQJf馬鹿かどうかはともかく、知識がないことは認めます。
質問の仕方が悪かったようなのでまとめます。。
自分用に日記スクリプトを組んで、
ローカルでは正常に動きました。
環境はMacJPerlとWEB共有でした。
MacJPerlでの構文チェックはOKが出ました。
このあと、借りているサーバにアップして
パーミッション設定をして動かしてみました
そしたら、一部の機能は動いたんですが
サーバがエラーを返す時もありました
なぜかわからないので、
もしかしたら・・と思うところがあったら
教えていただけませんか?
0062名無しさん@お腹いっぱい。
01/10/26 20:26ID:???0063名無しさん@お腹いっぱい。
01/10/26 20:40ID:???で、残念だけど、自分で書いたコードならその「エラーを返す時」がどんな
コードなのかを書かないと答えられない
これを使ってエラーを捕捉してみてくれ
http://www.kawa.net/works/perl/catch/news.html
Unixlike<=>Mac<=>WIN、環境で結構引っ掛かるので俺が知ってるのは
ディレクトリ区切り子 \とか/とか:とか
ディレクトリ相対パスの問題 IIS3とか
スクリプト起動時のカレントディレクトリの問題
OSに依存したシステムコール
OSに依存した関数の使用
多分まだまだネタはあるはず
0064名無しさん@お腹いっぱい。
01/10/26 22:16ID:e913wNIn出てくるようなのですが、これをタイムスタンプ順にすることは
可能でしょうか?
006551
01/10/27 00:19ID:CaJiAhlr>>53
>>54
ありがとうございます。
確かに・・・。
流れを読んだ上で組み合わせれば何と言うことのないことでした。
>>52さんが紹介してくれたサイトのスクリプトをじっくり眺めてみることにします。
ありがとうございました。
0066名無しさん@お腹いっぱい。
01/10/27 01:54ID:LY0Lfwspディレクトリ単位でソートするなら可能だよ。
find( {wanted => \&wanted, preprocess => \&preprocess }, $dir );
sub preprocess {
@_に入ってくるファイル名をタイムスタンプでソートした結果を返す
}
0067名無しさん@お腹いっぱい。
01/10/27 08:38ID:C540eYR0ディレクトリ単位で良いです。っていうかディレクトリ単位が良いです。
助かりました!
0068名無しさん@お腹いっぱい。
01/10/27 15:49ID:???から組んでるんだけど知り合いとかはさくさく組んじゃうんだよね。
フローチャート作ってる俺って厨房ですか?
0069名無しさん@お腹いっぱい。
01/10/27 16:12ID:???グチャグチャと絡まった概念を解く事が出来るから漏れは良く書いてる
(覚え書き程度のもんだが・・・)
Keyboardばっかり叩いてると、紙に書いた事は結構クッキリと頭に残ったりとかね
*死ぬ程忙しい時は、するべき事を紙に書いてみよう、意外と大事な用は一つだったりして
0070名無しさん@お腹いっぱい。
01/10/27 18:37ID:???0071名無しさん@お腹いっぱい。
01/10/27 20:09ID:???$var >>= 5;
ではどっちが速いですか??
0072Perl上級者
01/10/27 20:32ID:???0073名無しさん@お腹いっぱい。
01/10/27 20:33ID:???自分でベンチマークとれ。
007471
01/10/27 20:34ID:???0075名無しさん@お腹いっぱい。
01/10/27 20:40ID:???0076名無しさん@お腹いっぱい。
01/10/27 20:42ID:???perldoc -u Benchmark
これで大体分からないかな、要はかっこでくくるだけだよ
0077名無しさん@お腹いっぱい。
01/10/27 20:45ID:???後者は小数点以下切り捨ててないかい?
0078名無しさん
01/10/27 20:50ID:???0079名無しさん@お腹いっぱい。
01/10/27 20:53ID:???0080名無しさん@お腹いっぱい。
01/10/27 21:13ID:???煽り止めれ。Perl上級者と同レベル。
0081Perl上級車
01/10/27 21:16ID:???こんな程度の低いところは嫌だからな。
0082名無しさん@お腹いっぱい。
01/10/27 21:18ID:???0083名無しさん@お腹いっぱい。
01/10/27 21:21ID:???0084名無しさん@お腹いっぱい。
01/10/27 21:24ID:???過疎地うろついてないでマ板いきなよ
Perlスレもぽこぽこ建ってるし
0085名無しさん@お腹いっぱい。
01/10/27 22:52ID:???0086名無しさん@お腹いっぱい。
01/10/27 22:56ID:???0087名無しさん@お腹いっぱい。
01/10/28 21:53ID:???0088名無しさん@お腹いっぱい。
01/10/29 03:25ID:pi9OrPjFみたいなアルファベット大・小文字全部並べるスライスの,簡単な書き方ってありますか?
関数に文字数指定して,文字列として書かせたのを,evalして使ってるんですが
無駄なことしてるかもと思ったので。
0089名無しさん@お腹いっぱい。
01/10/29 03:30ID:???009088
01/10/29 03:50ID:pi9OrPjF普通に手で書くと,文字数増えるごとに書くのもどんどん増えていっちゃうので,
(aa..ZZ)とか(\w{3})みたいな書き方はできないかなぁと。
88の関数はこんなのです。
@arry = eval getArry(1);
sub getArry {
my $nest = shift;
my $word = shift || '';
my $i = 0;
my $ret = '';
foreach (a,A) {
my $word = $word.$_;
if ($nest>0) {
$ret .= getArry($nest-1, $word);
} else {
$i++;
$ret .= "$word..";
$ret .= 'z'x length $word;
$ret .= ',';
}
}
return $ret;
}
0091名無しさん@お腹いっぱい。
01/10/29 07:15ID:???つーかむしろ(a..z)だけにして、文字列長投げるような関数に
した方が良いんじゃないの?
呼び出しのコストを嫌ってるのか・・・・
漏れはデカイ配列の方が嫌いだけどなあ
0092名無しさん@お腹いっぱい。
01/10/29 07:19ID:???再帰しなくても良さそうだな、、
帰ったら書くわ
0093名無しさん@お腹いっぱい。
01/10/29 17:18ID:???>漏れはデカイ配列の方が嫌いだけどなあ
俺もおなじくです。2文字(aa〜ZZ)ぐらいならいいんですが、
4文字(aaaa〜ZZZZ)なんかはちょっと配列に入れるのがつらい。
用途にもよるけど、呼び出すごとに「次の文字列」を返す関数を
作って、STLのnext_permutationみたいな使い方をするのが
いいと思う。
0094名無しさん@お腹いっぱい。
01/10/29 20:26ID:gd3uwUNc一番メモリを使わずに調べる方法は何ですか?
0095名無しさん@お腹いっぱい。
01/10/29 21:04ID:???0096名無しさん@お腹いっぱい。
01/10/29 21:14ID:???nバイトずつreadして"\n"の個数を数える。
0097名無しさん@お腹いっぱい。
01/10/29 21:15ID:???my ($lineNum,$fileName,$buf);
open (FH,"fileName");
while (1){
read(FH,$buf,1);
last if $buf eq '';
$lineNum++ if $buf eq "\n";
}
print "行数は$lineNumです\n";
0098名無しさん@お腹いっぱい。
01/10/29 21:45ID:???open(FH, $file) or die "Can't open $file";
my $count;
$count = $. while (<FH>);
close(FH);
0099名無しさん@お腹いっぱい。
01/10/29 21:54ID:???大量のデータを長期間無駄に保持するのは避けたいけど、
ほとんどの場合、あえて明示的にundefするまでもないと思う。
まあ具体的なコードを見ないと判断つかないっすね。
0100始めて数日なんですが
01/10/29 22:08ID:???0102名無しさん@お腹いっぱい。
01/10/29 22:14ID:???> 始めて数日なんですが
日本語を?
0103名無しさん@お腹いっぱい。
01/10/29 22:21ID:WYkKLjrwperldocの該当個所を4〜5回読み直し、それでも理解できなければ
いまは知る必要がないのだとあきらめて後回しにした。
すくなくとも他人の言葉には頼らなかった。
0104名無しさん@お腹いっぱい。
01/10/29 22:21ID:???とにかく、首をくくるのがいいと思われ
0105マジレス
01/10/29 22:23ID:???始めて数日の人がそんな壁にぶつかる訳がありません。
Googleで検索したりリンク辿ったりすれば、参考になるものが
見つかるはずです。
少なくとも初心者の内は検索などで十分です。
(分不相応な事をしなければ)
そして初心者を抜ければ殆ど自分で判断できるようになる筈です。
0106Perl上級者
01/10/29 22:27ID:???0107名無しさん@お腹いっぱい。
01/10/29 22:28ID:???お前も一々煽るな。邪魔臭い。
0108Perl上級者
01/10/29 22:29ID:???0109名無しさん@お腹いっぱい。
01/10/29 22:32ID:???馴れ合いの逆は煽りかよ。馬鹿丸出し。
いいからとっとと失せろ。
0111名無しさん@お腹いっぱい。
01/10/29 22:37ID:???0112名無しさん@お腹いっぱい。
01/10/29 22:43ID:???「どうなの?」って聞かれても何と答えれば良いのやら。
0113名無しさん@お腹いっぱい。 :
01/10/29 22:59ID:???0114Perl上級者
01/10/29 23:09ID:???0115Perl上級者
01/10/29 23:12ID:???あとtinkopinpinとか ゲラゲラ〜
0116名無しさん@お腹いっぱい。
01/10/29 23:18ID:???この板の哀愁が漂ってくるね
もっと勉強しよ・・・
0117名無しさん@お腹いっぱい。
01/10/30 01:03ID:???あるログインCGIを作っていて
ログイン(ID/Pass)→ メニューとメイン画面をフレームで表示
と言う処理を行っています。
このときメニューとメイン画面もログイン用のファイルと一緒にしているのですが、
別々の物に分けたほうが良いのでしょうか?
//サンプル
if{
&ログインパスチェック
}elsif{
&左フレーム(メニュー)表示
}else{
&右フレーム(メイン画面)表示
}
#それぞれ引数を変更してやって判定
sub ログインパスチェック{
if(パスチェックが成功したら){
print <<EOM;
<FRAME SRC=./login.cgi?id=$in{'id'}&passwd=$in{'passwd'}&cmd=01 NAME="menu">
<FRAME SRC=./login.cgi?id=$in{'id'}&passwd=$in{'passwd'}&cmd=02 NAME="main">
EOM
}else{
print <<EOM;
<FRAME SRC=./login.cgi?id=$in{'id'}&passwd=$in{'passwd'}&cmd=01 NAME="menu">
<FRAME SRC=./login.cgi?id=$in{'id'}&passwd=$in{'passwd'}&cmd=03 NAME="main">
EOM
}
瞬間的に3度同じファイルを実行する事になり、そのたびにデータを読み出しているので心配です。
また、他のファイルに分けて処理した方が動作がスムーズになる、とも聞きました。
どうでしょうか。
足りない部分があれば随時補足させて頂きます。
根本的にこんなロジックにした方が良い、と言う意見もあれば是非お聞かせください。
0118名無しさん@お腹いっぱい。
01/10/30 01:27ID:mgB2/g2Wこの場合、認証をすべてlogin.cgiでまかなうのも、
login.cgi、frame.cgi、main.cgi、menu.cgi等に分割するのも、
さして変わりはないと思う。
どちらにしても認証後に3つのCGIがほぼ同時に起動するわけだし。
なにか改善策があるとすれば、
>根本的にこんなロジックにした方が良い、と言う意見
ここだろうけど、おれには考えつかない。
CGIで認証する限り、「1ページ表示するごとにパスワードファイルの読み書きが必要」と
いう問題は避けられないのでは。
0119名無しさん@お腹いっぱい。
01/10/30 03:48ID:???なるほど、貴重なご意見有難うございます。
やはり逐一パスワードファイルにアクセスしないといけないのは
宿命ですかね。
0120名無しさん@お腹いっぱい。
01/10/30 09:32ID:???どっちかってーとCGIだけどなんか質問ある?向きだけど・・・
とりあえず「セッション」とかって言葉を調べると幸せになれるかもしれません。。。えいめん。
0121ぽ
01/10/30 14:05ID:KnXoAd8Aライブラリの場所は 相対で ../lib にあります。
エレガントな指定方法を教えてください。
今は
{
my $base;
BEGIN{
$libPath = $0;
$libPath =~ s|/[^/]+$|/lib|;
}
use lib ($libPath);
}
■ このスレッドは過去ログ倉庫に格納されています