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

【Perl】初心者コーナー Part12

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/04/27 23:17ID:1NNXdNsp
 
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

CGIの質問は【CGIだけどなんか質問ある Pert 6 】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4 】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10を見よう。
 
0421nobodyさん02/05/04 18:52ID:???
>>420
つーと、>>416 は、なんかの変数に入ってるの?
改行されてるのは何故?
つーか、>>416の文字列は、どっからコピペしたの?なんかの出力?
042241202/05/04 18:56ID:???
>>421
失礼ですがクッキーの事はご存知なんでしょうか?
042342102/05/04 19:01ID:???
>>422
うん。掲示板作る時に使ったよ。
で、オレが知ってるcookieは、$ENV{'HTTP_COOKIE'};に渡されるんだけど、
>>422のクッキーっていったいなんなの?
042441202/05/04 19:12ID:???
>>423
すみません。ウタガテマシター。
($dummy,$biscuit)=split(/=/,$ENV{'HTTP_COOKIE'});
@cookie=split(/,/,$biscuit);
foreach (@cookie){
($cookname,$cookvalue)=split(/:/,$_);
$cookname=~s/ //;
$COOKIE{$cookname}=$cookvalue;
}
取得の方法は↑です。
僕が利用したいクッキーはチェックを入れた項目のみをクッキーに保存しています。
バナナにチェックを入れるとバナナ:はい
となります。
で次にジュースにチェックを入れるとすると
バナナ:はい
ジュース:はい
とならずに
そのままクッキーに上書きされて
ジュースのみはいとなってしまいます。
これを
バナナ:はい
ジュース:はいとバナナの下に追加で書き込めるようにしたいです。
先程のやり方もありますが、メンドクサソウデスノデこの方法解りますか?
0425nobodyさん02/05/04 19:23ID:???
>>424
うっかりソースを晒したからCGIスレの黄金厨118だって事がバレちまったな(w

で、この問題については他のスレできちんとした答えをもらっているだろ?
キーが全てaだったらそりゃ上書きされる。キーを変えれ。ハッシュを学べ。
042641202/05/04 19:25ID:???
すみません。簡単に説明すると掲示板でメールをクッキーに保存して
読み込むとhoge@***となります。
そのhoge@***を消してまた情報を送信するとクッキーには
2度目に記入したメールアドレスがクッキーのメールの部分に上書きで保存されるとします。
そこを、
メール:hoge@***
メール:2度目に入力したもの
このようにクッキーに保存して、
1度目に記入したメール
hoge@***読み込んで
2度目に記入したメール
2度目に入力したもの
と読み込みたいです。

042741202/05/04 19:28ID:???
CGIスレに書き込んだのは一度きりで、
あれは偽者です。
信じるか信じないかはあなたの自由ですけど、、、。
0428nobodyさん02/05/04 19:36ID:???
>426
$cookie{'mail1'}にまず最初のクッキーを保存。
2度目では$cookie{'mail1'}を$cookie{'mail2}にコピーしてから、$cookie{'mail1'}を上書き。
同じキーでは無理だから、別のキーを考える。
0429nobodyさん02/05/04 19:39ID:???
>>427
#!/usr/local/bin/perl

print
"Set-Cookie: a=aaaa\r\n",
"Set-Cookie: a=aa\r\n",
"Set-Cookie: a=aaa\r\n",
"Set-Cookie: a=a\r\n",
"Content-type: text/html\r\n\r\n",
$ENV{'HTTP_COOKIE'};

適当な名前(cookie.cgiとか)を付けて保存して実行してみれ。
やろうとしている事が無謀だとわかるだろ。
あと、Cookie読む時はエスケープも解除してやれ。
043042302/05/04 20:24ID:???
>>424
print $ENV{'HTTP_COOKIE'};
すると、
dmy=バナナ:はい,ジュース:はい,メール:hoge@***,メール:foo@+++
って入ってるなら、
$COOKIE{$cookname} .= ($COOKIE{$cookname} ? "\n" : undef) . $cookvalue;
そうじゃないなら、
Set-Cookie: dmy=バナナ:はい,ジュース:はい,メール:hoge@***,メール:foo@+++
する。EXPIRESも付けたきゃ勝手に付けてくれ。
0431nobodyさん02/05/04 20:37ID:???
>>430
同じキーを持つクキーはそもそも保存されないんだってさ
043243002/05/04 21:06ID:???
>>431
うん。>>430の例もキーはdmy一つだけ。
0433nobodyさん02/05/04 21:21ID:???
>>427
  _____________
 (つかえねぇ奴らだな。氏ね!!)
   ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   | ̄ ̄ ̄ ̄ ̄|             ___________
   | ∧_∧  |    ∧_∧   /
   | ( ´∀`)  |    (´∀` ) <オマエモ・・・オレモナー??
   | ( ???:bI ) .|    ( Id:??? )   \
   | | |  |  .|    | | |       ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   | (__)_) .|     (_(__)
   . ̄ ̄ ̄ ̄ ̄

※偽者防止のため、IDは必ず出しましょう。


PC初心者でもやってるぞ。
0434nobodyさん02/05/04 21:22ID:???
>>432
スマソ。逝って来る。
0435nobodyさん02/05/04 21:24ID:GvcNIgW1
サブルーチンについての質問です。
sub function
{
######省略
}

を呼ぶとき
function(); と &function;
の2つのやり方あるみたいですけど、どっち使ってもいいの?
0436nobodyさん02/05/04 21:26ID:???
>435
後者の方がいい。
汎用性のあるものを組みたいなら特に。
043743502/05/04 21:29ID:GvcNIgW1
>>436
ありがとう。
自分が持ってる参考書にfunction()しか載ってなかったから使っちゃいけないのかと思ったよ。
0438 02/05/04 21:35ID:dGBL2sA8
画像スケールを縮小してサムネイルをつくってアルバムにするCGIを作りたいんですが
どうしたらよいのでしょうか?
0439412 ◆ZJG8NJmQ 02/05/04 21:41ID:???
#!/usr/local/bin/perl

print "content-type:text/html\n\n";
ここからまずフォームを作ります。

それからログファイルを開いて読み込みます。
で表示します。

ログ書き込み処理
\nや<>とかを変換します。
そうしたらログを開いて書き込みます。
そして閉じます。
0440nobodyさん02/05/04 21:41ID:???
>435
Perl5以降ならfunction()でいいと思うけど。
普通のプログラミング言語ではfunction()と書くので、&を付けると嫌われる。
ただでさえスカラーの前に$とか付いて笑われているのに。
一生Perlしか使いそうにないなら&functionでもいいけど。
ただし、&functionとfunction()では若干動作が異なるとだけ覚えておいてください。
0441nobodyさん02/05/04 21:56ID:???
つか&functionだとプロトタイプが効かねぇのが嫌です。

尤も、「貧弱なプロトタイプなんぞいらん」とか
「関数なにそれ?メソッドのこと?」って人には関係ない事ですが。
0442nobodyさん02/05/04 22:24ID:???
index.htmlのないディレクトリにアクセスするとファイルリストが表示されるものがあります。
しかし私のサイトではそれが許可されていません。
perlプログラムであるディレクトリ以下を全部回って
それぞれにindex.htmlファイルを作っていってくれるプログラムを知りませんか。
0443nobodyさん02/05/04 22:26ID:3kOee6Z3
あげるの忘れた。
0444nobodyさん02/05/04 22:34ID:???
>知りませんか。
作ればいいじゃん。
0445nobodyさん02/05/04 22:39ID:3kOee6Z3
>>444
あっさり言いますけど。間違えてサーバー内で無限ループって恐怖があって。
0446sage02/05/04 22:40ID:???
再帰の深さに制限付ければOK。
0447nobodyさん02/05/04 22:45ID:???
下げるの忘れた。深さは2つまででいいですが。
0448さゆ ◆ugYa5.J6 02/05/05 00:01ID:???
>>442
スレ違いな回答でわるいんだけど、
.htaccess に
Options +Indexes
って一行書いておくと、うまくいくかも。
(サーバの設定次第だけど)
0449nobodyさん02/05/05 00:49ID:???
うちのサーバーはそれもDirectoryIndexもできないのです。
0450&付きであろうと無かろうと02/05/05 01:27ID:???
自分にとって、可読性の高い方で書けばいいじゃん。
0451nobodyさん02/05/05 01:28ID:???
やたらサブルーチンで&使うの嫌う人居るけど処理的に
どういう差があるんですかね?
rootin();と&rootin;どちらでもいい状況なら俺も後者使うんだが。
0452さゆ ◆ugYa5.J6 02/05/05 01:35ID:???
>>449
むぅ。
したら、仕方ないので、perldoc File::Find で GO!
0453thanks.html02/05/05 01:39ID:nX5kzORe
>>410
アリガソ。
うむ、なんでかわ良くわからないんだけど(・・漏れってつくづく
基本がなってないヤツだ・・・)
#(ok)のほうじゃないとダメなんですね。覚えておきます。
0454nobodyさん02/05/05 01:50ID:nX5kzORe
1つのCGIを複数の要素で使う場合。index.cgiには以下のコードのみ

#!/usr/local/bin/perl
$task = $in{"task"};
require "$task.pl";

として、例えば掲示板とアクセスカウンターを以下のように使い分ける

[掲示板] bbs.pl
http://hage.com/cgi-bin/index.cgi?task=bbs

[アクセスカウンター] access.pl
http://hage.com/cgi-bin/index.cgi?task=access

とした場合。
なんか不都合な事ってあるだろうか?
質問が抽象的でアレですが、index.cgiにかかる負荷というのは
普通にbbs.cgi、access.cgiとして実現した時となんら変わらない
のだろうか?
0455nobodyさん02/05/05 01:59ID:???
>>454
うん。requireしてもしなくても変わんない。
0456nobodyさん02/05/05 02:16ID:???
>>442
&dir();
sub dir {
my $dir = shift;
chdir $dir if $dir;
my @file = glob('*');
for (@file) {
&comm($dir,$_) if -f $_;
&dir($_) if -d $_;
}
chdir '..';
}

sub comm {
my ($dir,$file) = @_;
print "$dir/$file\n";
}
0457nobodyさん02/05/05 02:39ID:???
>>456
ケチ付けるようで悪いが、車輪の再発明はやめて、標準ライブラリの
File::Findを使えば?
perldoc File::Find 又は、ラクダ本のP506又は、
http://www.bekknet.ad.jp/~bero/docj/module_/10/File_Find.html
0458nobodyさん02/05/05 03:07ID:???
モジュールの『使い方』より具体的なコードの方が見てて楽しいけどね。
0459nobodyさん02/05/05 03:30ID:???
(゚д゚)ハァ? >>456の sub dir{...} の部分をFile::Findに
置き換えるだけ、と言っていいじゃん。最近は、ドキュメント
も読まず、自分で知恵も出さず、安易にコードをパクろうと
する厨が多すぎ。
0460nobodyさん02/05/05 03:47ID:???
&付ける奴ってKENT WEBとかで学習した厨房だろ。アホに限ってよく&付けてるな。
0461nobodyさん02/05/05 04:30ID:???
&を付ける奴は居ないだろ。
0462nobodyさん02/05/05 04:49ID:???
>>449
$dir = $ENV{'PATH_INFO'};
$uri = $ENV{'REQUEST_URI'};
$base = $uri;
$base =~ s#/([^/]+?)$dir$#/#;
$cgi = $uri;
$cgi =~ s#$dir$##;
$dir =~ s#^/##;
chdir $dir;

print "Content-Type: text/html\n\n<H1>Index of $base$dir</H1><BR>\n<table>";
while(<*>) {
    if ( -d $_ ) {
        $ref = "$cgi/$dir$_/";
        $fname = "$_/";
        $size = '[DIR]';
    } else {
        $ref = "$base$dir$_";
        $fname = "$_";
        $size = (stat $_)[7];
    }
    print "<tr><td><a href='$ref'>$fname</a></td><td align='right'>$size</td></tr>\n";
}
print "</table>\n";
0463nobodyさん02/05/05 04:58ID:???
最近やっとPerlの便利さがわかってきたよ。
0464nobodyさん02/05/05 08:51ID:???
foo()と&fooはまるで意味が違うのにさえ気をつければどっちでもいいだろ。
0465nobodyさん02/05/05 16:34ID:???

カウンタを作っていてあと一歩のところまで来ているのですがうまくいきません。

症状

10・11・12・13・14・・とカウントアップしていき
18まではいいのですが次にリロードすると19のはずがなぜか29と表示されてしまいます。

そのあとはまた20に戻るのですが、再び21・22・23・・とカウントアップし
28まではいいのですが29のはずが39と表示されてしまいます。

ソース

http://ruffnex.oc.to/ipusiron/upload/417.txt

どなたか原因わかりますでしょうか?
0466nobodyさん02/05/05 16:35ID:???

表示させるときは

<img src="./counter.cgi?4">
<img src="./counter.cgi?3">
<img src="./counter.cgi?2">
<img src="./counter.cgi?1">

という感じにして呼び出しています
0467nobodyさん02/05/05 16:44ID:???
>>465
19 の画像が 28 というオチじゃないよね?
0468nobodyさん02/05/05 16:44ID:???
>>465
一文字切り出し時の処理が変なんじゃないの?
0469nobodyさん02/05/05 16:44ID:???
>>467
アフォか…(w

○29
×28
0470nobodyさん02/05/05 16:49ID:???
>>460
>KENT WEBとかで学習した厨房だろ。アホに限ってよく&付けてるな。

真性のPCヲタとかは知らんけど普通の人が別に趣味で覚える分には
最初は大体そんなもんです。実際&〜;でも〜();でもどっちでもいい。
0471nobodyさん02/05/05 16:56ID:???
>>467

いや、画像は0〜9までで一桁ずつ切り出して処理してます
0472nobodyさん02/05/05 17:17ID:???
>>465
俺の環境ではその様な現象起きなかったよ…
つか、画像一体型じゃ駄目なの?その方が鯖にかける負担も少なく済むし
0473nobodyさん02/05/05 17:39ID:???
>>472

画像一体型というとgif連結ですか?
まだ始めたばかりなのでまずは簡単なのからやってるので。。

当方win98se + アパッチ + アクティブperlです
0474nobodyさん02/05/05 17:58ID:???
>>473
なら、fly 使ってできるよ。俺はそれ使ってる
0475nobodyさん02/05/05 19:30ID:eXghpSwQ
>465
原因は、画像がブラウザのキャッシュに残ってるからだとおもいます。

0476nobodyさん02/05/05 21:05ID:gfSt2Khc
flockについて

open(IN,"$filepath");
@data=<IN>;
close(IN);
#処理#
open(OUT,">$filepath");
flock(OUT, 2);
print OUT @data;
close(OUT);

この場合flockはOUTの1回だけですけど、INのときもflockしたほうがいいですか?
0477nobodyさん02/05/05 21:08ID:???
>>408
亀レスですが、ありがとうございます。よくわかりました。
0478nobodyさん02/05/05 22:21ID:???
>>476
すべきでしょう。途中で内容書き変わったら困るでしょう。
0479nobodyさん02/05/05 22:31ID:???
>>476
読み込み時は共有ロック、書き込み時は排他ロック
0480nobodyさん02/05/05 22:33ID:???
>>476
むしろ二度開けてるのをなんとかした方がいいんでない?
0481nobodyさん02/05/05 22:52ID:???
>>479
信頼性落ちない?カウンタにそんなもん求めても仕方ないけど。
0482nobodyさん02/05/05 22:53ID:???
>>481
何故?>>479の方法が普通でしょ。
048347602/05/05 23:12ID:lg58HjNF
意見ありがとうございます。

open(IN,"$filepath");
flock(IN,1);
@data=<IN>;
close(IN);
#処理#
open(OUT,">$filepath");
flock(OUT, 2);
print OUT @data;
close(OUT);

こんな感じ?
0484nobodyさん02/05/05 23:21ID:???
>>483
書き込みモードでopenするのは危険。

俺なら
open IO, "+<$file" or throw error;
flock(IO, LOCK_EX) or throw error;
while(<IO>){
# 処理
}
seek IO, 0, 0;
print OUT __ANY_DATA__; # 適当に出力
close OUT;
048547602/05/05 23:24ID:lg58HjNF
危険というのはどうなってしまうのですか?
0486nobodyさん02/05/05 23:26ID:???
>>485
openと同時にファイルが(一時的に)空になる。
よって、書き込む前に自分がクラッシュしたり、誰かがロック権を得たりすると破滅する。
048747602/05/05 23:31ID:lg58HjNF
なるほど。
変えてみました。

open(FILE,"+<$filepath") or die(error);
flock(FILE,2);
@data=<FILE>;
#処理#
seek(FILE,0,0);
print FILE @data;
close(FILE);
0488ぺるにゃん02/05/05 23:33ID:???
通りすがりの Perl 好きです。

>>486
勉強になりますにゃ。
0489nobodyさん02/05/05 23:42ID:???
>>487 で、
データの量が、処理前より、処理後の方が小さくなるとき、
おかしくなりませんでしたっけ?

0490nobodyさん02/05/05 23:56ID:???
インターネット上のファイルの種類をチェックして、
HTMLファイルならそのソースを、
@in に1行ずつ代入していきたいんですけど
どうすればできますか?
0491nobodyさん02/05/05 23:56ID:???
>>489
なるね。truncate()すればいいのかもしんないけど。
0492nobodyさん02/05/05 23:56ID:???
>>490
lwpつかって、HEADすればいんでないかな。
0493nobodyさん02/05/05 23:59ID:???
>>492
すいません、よくわかりません。
詳しく説明されているHP等ご存じですか?
0494nobodyさん02/05/06 00:05ID:???
>>491
Cookbookでは、こうやってるね。
seek(FH,0,0);
print FH @data;
truncate (FH, tell(FH));
close(FH);
0495nobodyさん02/05/06 00:12ID:???
>>493
ほい。
http://www.google.com/search?hl=ja&q=lwp%82%CC%8Eg%82%A2%95%FB&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
049647602/05/06 00:12ID:/skFdheW
>>487でopenは1回にしたんですけど、2回openする場合こっちでもいいですか?

open(IN,"$filepath");
flock(IN,1);# 排他じゃだめ?
@data=<IN>;
close(IN);
#処理#
open(OUT,"+>$filepath");
flock(OUT, 2);
seek(OUT,0,0);
print OUT @data;
close(OUT);
0497nobodyさん02/05/06 00:23ID:???
flockってopenの後で良いの?
0498nobodyさん02/05/06 00:23ID:???
>>497
ごめん、寝ぼけ。
0499nobodyさん02/05/06 00:26ID:???
>496 >>486の問題があるんでない?
050047602/05/06 00:34ID:/skFdheW
>>499
ファイルに書き込む場合(2回目のopen)を+>にしたらだいじょぶかと思ったけど
だめですか・・・。

050147602/05/06 00:42ID:/skFdheW
なんどもすみません。
やはり>>487のやり方にしました。
ありがとうございました。


>>500&496
+> を +< に訂正。
050249502/05/06 00:42ID:???
>>493
もっといいのみっけた。
http://www.isc.meiji.ac.jp/~sumwel_h/cyberlaw/tech/htmlfaq01.htm
0503nobodyさん02/05/06 00:58ID:/8u085RL
こんばんわ、今「perl」を勉強しているんですが、「perl」を使いこなせるように
なれば、具体的にはどんなことが出来るのでしょうか?
アプリとか作れるのでしょうか?自分が知ってるのはCGIを作れると言うぐらいでよくわかりません。
厨名質問ですが、どなたかご教授願います。
0504nobodyさん02/05/06 01:14ID:???
>>503
>いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
0505nobodyさん02/05/06 01:18ID:???
>>504
このくらいいいじゃないか。

>>503
具体的も何も、ほぼ「何でも」出来る。
0506nobodyさん02/05/06 01:21ID:???
>>503
せめてFAQぐらい読もう(1.10とか)
http://www.att.or.jp/perl/faq/faq0j.html
>>505 俺も激しくスレ違いと思うが(と言うか努覧ヘ不足)
0507nobodyさん02/05/06 01:36ID:???
cookieを出さない、cookieを食べない場合にエラー表示させたいのですが…。
050849502/05/06 01:41ID:???
>>507
食べないは難しいけど、出さないは
print "Fuck So Reena!" unless $ENV{'HTTP_COOKIE'};
とか。
0509nobodyさん02/05/06 01:43ID:???
>>495
有難う御座います。
勉強してきます
0510nobodyさん02/05/06 01:50ID:???
>>508
ありがとうございますどもです。
051151002/05/06 02:17ID:???
>>508だと一度もクッキー食べた事が無い人も弾いてしまう?
0512nobodyさん02/05/06 02:43ID:e2HRGuxk
perlで一般的な文字列置換をする場合、最長一致で置換されると思うのですが、
これを最短一致にするにはどうしたらいいでしょうか。
よろしくお願いします。
051350802/05/06 03:04ID:???
>>511
もちろん、問答無用で。
なので、食わせるページと、チェックするページを分けたほうが
いいとおもうね。
0514nobodyさん02/05/06 03:06ID:???
>>512
perl5の本読んだ?
.+? みたいに、+や*に? つけると最短一致ぜよ。
0515nobodyさん02/05/06 03:31ID:e2HRGuxk
>>514
なるほど!ありがとうございます。
051650302/05/06 04:22ID:/8u085RL
>>505>>506さん、ありがとうございます。
他のみなさんへスレ違いな発言で、ごめんなさい・・・
もっと精進します!
0517nobodyさん02/05/06 07:06ID:???

open(IN,"$logfile") || &error;

この省略した書き方について誰か説明お願いしますm(_ _)m
0518nobodyさん02/05/06 08:27ID:???
>517
ネタか?
0519nobodyさん02/05/06 09:10ID:???
>>518

いえマジです
0520nobodyさん02/05/06 09:12ID:???
>>517
「さもなくば」と読めばいい。
■ このスレッドは過去ログ倉庫に格納されています