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

【Perl】初心者コーナー Part19

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/02/09 00:24ID:s0tpWWxg
初めに→「perl」その物のスレです。

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

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


CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

あとは>>2-10。
0313nobodyさん03/02/20 00:14ID:???
$ENV{'TZ'} = "GMT-9";
$ENV{'TZ'} = "Japan";

とかでもやってみるとか。
0314nobodyさん03/02/20 00:16ID:???
>>311
お前も>>273の忠告をことごとく無視してるが。
031526603/02/20 00:21ID:Hhj+m+Kj
>>311
あるよ
0316nobodyさん03/02/20 00:24ID:???
>>309

perl -cでチェックできるのは、コンパイルエラーのみだから、
実行したときに発生するエラー(require失敗、関数が見つからない)は、
存在するかしないかは分からない。
0317nobodyさん03/02/20 00:25ID:???
「は」、と、「が」、を間違えました。
031826603/02/20 00:32ID:Hhj+m+Kj
>>291,312
どうもありがとうございます。
もう一度先頭行を確認してみます。
0319nobodyさん03/02/20 01:06ID:???
>>266
http://www.harukaze.net/~mishima/perl/cgi-debug-env/deb-tech.html
0320マリモーマ ◆r6PDGT6Xd2 03/02/20 08:45ID:ZbzyrSlf
ローカルテストで 無限ループになったら
windowsタスクマネージャーで perl.exeを 終了させると
いいらしい
0321nobodyさん03/02/20 09:04ID:hpPhmqwv
>>320
初心者らしい意見を有り難う。
032230403/02/20 09:05ID:Am46dVIU
ありがとうございました。
URLエンコードというのですか。
勉強になりました
0323nobodyさん03/02/20 09:25ID:???
>>309
Syntax checkがOKならperl filenameでコマンドラインから実行しろ。
0324nobodyさん03/02/20 09:50ID:???
perl filename > test.html

って具合のが見易くて良いかもね。
0325nobodyさん03/02/20 09:57ID:???
すいません、正規表現なのですが
一行内に特定文字列(>>\d+)がいくつあるか
数える方法というのはありますでしょうか?

現在、代案として下記のように>>\dで
splitし配列を数えているのですが
いかんせん正攻法じゃないので...


local @tmp = split(/>>\d+/,$_);
print $#tmp;
0326nobodyさん03/02/20 10:15ID:???
>325
適当な配列にコピーしてs//gして帰ってくる数値を見ればいいんでない?
もしくはwhile(/>>\d+/g)ってやってカウンタを増やすとか…
0327nobodyさん03/02/20 10:29ID:???
>>325
print (@tmp =~ s/(>>\d+)/$1/gs);
0328nobodyさん03/02/20 10:51ID:???
>>327
> 一行内に特定文字列(>>\d+)がいくつあるか
これを読んでいなかったスマソ

my $count = 0;
foreach(split(/\n/,$_)){
print sprintf(qq{">>\\d+"の数:%0d 行目 %0d 個},++$count,(s/(>>\d+)/$1/g));
}
0329nobodyさん03/02/20 10:58ID:???
>>326>>327
置換処理をすると処理した数が返ってくるのですね
勉強になりました
これで万事解決です
ありがとうございました!
0330nobodyさん03/02/20 20:18ID:ve8bV8Zf

「このまま一生彼女ができないのでは…」

 私は社会学を専攻している者です。社会学や周辺の学問を利用し、実践的な
恋愛理論を開発しております。机上の空論に終わらず、あくまで実践的。効果
は絶大です。この理論は私自身の苦悩から生まれました。モテないことに深く
悩んでいた私は社会学部に入り、恋愛をはじめとするコミュニケーションにつ
いて考察することを決意。開発期間およそ6年。やっと研究が実を結びました。
ルックスなんて恋愛に関係ないということを自ら証明したのです。今回はその
集大成を公開しようと、メールマガジン発行を決めました。すでに数回発行し
ておりますが、購読者にはバックナンバーが閲覧できますのでご安心を!

 今ならまだ間に合います。春、出会いの季節に幸せが訪れるかどうかは、あな
たの選択次第です。絶対に後悔はさせません。「90日彼女ゲットプログラム」
もちろん購読は無料! → → http://www.h5.dion.ne.jp/~psysys/index.html
0331nobodyさん03/02/21 01:07ID:f3aIdgTv
質問です。
RaQ3で正常に動いていた画像掲示板が、RaQ550にサーバーを変えてから
エラーが出て動かなくなってしまいました。

エラーログを見ると
「Premature end of script hedders : /usr/cgiwrap/cgiwrap」
となっています。
これはどういう意味のエラーなのでしょうか?いろいろ調べたのですが
わからずほとほと困っています。

perlのバージョンが上がったのが原因なのかとも思いましたが、
なにぶん初心者なのでよくわかりません。
もしよろしければ教えていただければありがたいのですが。
よろしくお願いします!
0332nobodyさん03/02/21 01:40ID:???
>>331
・1行目の Shebang が違う。
・require の該当するファイルがパスの通ったところにない。
・適切な Content-type: エンティティを吐き出していない。
・外部ファイルへのアクセス時に、該当ファイルのパーミッションが不適切であった。
・長いので省略。全部見るには >>1
0333nobodyさん03/02/21 01:50ID:???
>>331
umaskかも。
0334nobodyさん03/02/21 02:12ID:???
だからCGIの質問はCGIのスレでしろと(略
0335nobodyさん03/02/21 02:46ID:p5R52YmN
質問させてください。
Perlモジュールを作ってるのですが、
拡張子.pmだと、ブラウザでアクセスされると中が見えてしまいます。
で、拡張子.cgiでモジュール使おうと思ったのですが、
それだと、useで呼び出せません。
拡張子.pm以外は、useで呼び出せないのでしょうか?
また、.pmファイルの中が見えないようにするにはどうすればいいでしょうか?
0336nobodyさん03/02/21 03:13ID:???
>>335
perldoc -f useを参照。.cgiでも使えるかも。
通常は鯖側で見えないように設定かと。

.htaccessの偉い人 Part3
http://pc2.2ch.net/test/read.cgi/php/1019888234/l50
033733503/02/21 03:22ID:???
>>336
ありがとうございます!
htaccessの設定を挑戦してみようと思います。
ありがとうございました!
033833103/02/21 11:42ID:???
>>332
>>333
ありがとうございました!
教えてもらったところをチェックしてみます!

前のサーバーで動いていたのに、新しいサーバーでは動かないのが
わからないんですよね・・パスはチェックしたけど
0339nobodyさん03/02/21 18:57ID:???
ファイルをopenしてランダムに一行のみ読み込みしたいのですが、
確かwhileを使う方法があったのですが思い出せません。
教えて頂けないでしょうか?
0340nobodyさん03/02/21 19:01ID:???
>>339
http://www.din.or.jp/~ohzaki/perl.htm#File_Random
0341nobodyさん03/02/21 21:47ID:???
>>335
use 'Some/Module.cgi';
0342nobodyさん03/02/22 00:49ID:???
>>341
エラー出るけど、それって使える?
0343 ◆hMJAPH9PWA 03/02/22 00:56ID:???
>>342
無理。使えない。require()するしかないね。
0344nobodyさん03/02/22 09:52ID:???
>>340
これでした!
ありがとうございます
0345nobodyさん03/02/22 12:20ID:00dHJZue
質問です
perlから以下のような内容を含むメールを送信したいのですが

&jis("この度は〜頂きありがとうございます。\n今回のオーダーは以下の内容で承りました。\nもしこの内容でよろしければこのままメールをご返信ください。〜

で送信後メールの「今回のオーダーは」
の部分が「今回のお錐桙ンは」
のように文字化けを起こします。他の箇所はよいのですが
この部分だけ文字化けを起こします。
何か対処法はあるのでしょうか?
よろしくですm(__)mペコリ
0346nobodyさん03/02/22 12:30ID:???
>>345
>>4のリンクを熟読してください。
0347あすか03/02/22 17:29ID:9iUywjuX
置換演算子に関する初歩的なことなんですが・・

$value =~ s/藁/笑/g;
で、藁を「笑」に変換するのはわかるんですが
これに「タグ」を利用したい場合どの様にすればよいのでしょうか?
つまり、もしも「藁」という文字列があった場合
「<b>笑</b>」と(←実際にはタグは実行されてしまっている)
したいんですが、</b>としたときの「/」が置換演算子とかぶって
しまいエラーになってしまいます・・・。(泣
0348nobodyさん03/02/22 17:36ID:???
\
0349nobodyさん03/02/22 17:36ID:???
/が解釈されないように\/にする。
世にこれをエスケープという。
/を置換演算子とやらとして解釈されないようにする。
s#藁#笑#g
世にこれを...知らん
0350マリモーマ ◆r6PDGT6Xd2 03/02/22 18:32ID:SFcrKMsp
>>345
今回のオ\ーダー ではどうかな?
0351nobodyさん03/02/22 18:36ID:9Q2QNoLV
constant で配列を宣言してそれをforeachなどで回すには
どうすれば良いのでしょうか?
↓こんな感じでやりたいんですが、、
use constant HOGE => ['hoge','hoge2','hoge3'];
print "$_\n" foreach(HOGE);
0352nobodyさん03/02/22 19:04ID:???
>>345
jcode.pl(.pm)を使う。

>>347
s/<b>笑<\/b>/藁/g; # /をエスケープ
s|<b>笑</b>|藁|g; # 区切り(デミリタ)を変える
s{<b>笑</b>}{藁}g; # 同上

>>351
use constant HOGE => ('hoge', 'hoge2', 'hoge3');
035335103/02/22 19:09ID:???
>>352
できました!どうもありがとうございます。
0354nobodyさん03/02/22 21:55ID:dmtEQjtb
perlでユーザーの大量クリックに耐えれるクリックカウンターcgiを作ろうとしているんですが、
ファイルロックしてもデータが飛んでしまいます。
どうすればデータが飛ばないように出来るんでしょうか?
0355nobodyさん03/02/22 21:55ID:???
どんなロックしてるか見せてみそ
035635403/02/22 22:14ID:dmtEQjtb
http://tohoho.wakusei.ne.jp/wwwperl2.htm#flock を参考に
open(OUT, "+< count.dat");
flock(OUT, 2);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT $i++;
close(OUT);
ってやってるんですが・・・。
大量のアクセスに耐え切れませんでした
0357nobodyさん03/02/22 22:28ID:???
>>356
実は書き込み先がローカルじゃなかった。とか。
0358nobodyさん03/02/22 22:28ID:???
それ、これまでのカウントってどこで読み込んでるの?
0359nobodyさん03/02/22 22:29ID:???
>>356
書き込む前にtruncateせず、
書き込み後にtruncate(OUT, tell(OUT));
0360nobodyさん03/02/22 22:31ID:???
あと、エラー処理入れれ。
0361nobodyさん03/02/22 22:35ID:???
要は、小出しにしたソースでは的確なアドバイスはできないってことだ。
0362nobodyさん03/02/22 22:36ID:???
>>356
読み出しと書き込みを一回で処理。
036335403/02/22 22:53ID:dmtEQjtb
if (open(F, "+< count.dat")) {
flock(F, 2);
$count = <F>;
$count++;
seek(F, 0, 0);
print F $count;
close(F);
} else {
&error();
}
いろいろ改良して、こんな感じなったんですけど、やっぱり1000回ぐらい何人かでやるとファイルの中身がおかしくなってしまいます
0364nobodyさん03/02/22 22:56ID:???
openのエラー処理しかしてねーじゃねーか。
0365nobodyさん03/02/22 22:59ID:???
「おかしくなる」って、どうおかしくなるの?
処理の結果ってのはバグの手がかりを知る大事な情報だから省略しないように。
036635403/02/22 23:04ID:dmtEQjtb
ファイルにアクセスが多くなると、ファイルの中身の値が適切じゃないものになってしまいます。
0367nobodyさん03/02/22 23:06ID:???
モロ画像とか?
036835403/02/22 23:07ID:dmtEQjtb
いや。同時に大量実行実験です。
それで、実行された回数を記録したいんです。
0369nobodyさん03/02/22 23:09ID:???
>>363
例えば、先行プロセスでflockが失敗したとする。
しかしエラー処理が無いのでそのまま進む。
ここで後続プロセスがロックがかかってないのでファイルをオープンする。
データが壊れる。
0370nobodyさん03/02/22 23:28ID:???
カウンターとかのファイルロックって、
限界があると思うけど・・・。
絶対壊れないようにするファイルロックはないです。
037135403/02/22 23:30ID:dmtEQjtb
では、MySQLのデータペースとか使えば壊れないでしょうか?
0372nobodyさん03/02/22 23:31ID:???
もし壊れても、可能な限り復旧するっていう形のほうがいいかも。
0373nobodyさん03/02/22 23:42ID:???
>>370
でたらめ抜かすな。ロックは2種類しかない。
正しいロックと駄目ロックだ。絶対に壊れないのが正しいロック、それ以外が駄目ロック。
0374nobodyさん03/02/22 23:59ID:???
>>363
truncateしろ。
0375nobodyさん03/02/23 00:02ID:???
>>374
サイズが増えるだけなら入らないと思われ
037635403/02/23 00:04ID:osZUd/C4
>> 374
truncateって何ですか?
0377nobodyさん03/02/23 00:08ID:???
だからエラー処理をしろって
0378nobodyさん03/02/23 00:18ID:???
>>363
その方法が最良じゃないかと思いますが。
無駄な処理とかないですし。
あとはflockとseekとcloseにエラー処理加えるくらいですね。
037937803/02/23 00:19ID:???
ちなみにtrancateは入れる必要ないですね。
0380nobodyさん03/02/23 00:26ID:???
>>373
そんなことない。
絶対壊れないようにするなんて不可能。
集中同時アクセスがつづけば、どんなロックしてても壊れるだろ。
0381nobodyさん03/02/23 00:29ID:???
ムキー!!!
なんで354は再三にわたってエラー処理をしろというレスを
無視するんだああああr;かえ;gk’えあ;rlf’あうぇr
0382nobodyさん03/02/23 00:50ID:???
>>381
まあおちけつ。
どうせ動かなくて困るのは質問した本人だけだ。
0383nobodyさん03/02/23 01:09ID:???
アクセス数を制限してみる。
flockを使わない。
0384nobodyさん03/02/23 01:10ID:???
>>380
それはチミが駄目ロックしか作れないという事を意味する。
0385nobodyさん03/02/23 01:15ID:PmGQRxss
Socketで?を含むURLをGETしようとしてるんですが、&amp; に展開されてしまってうまくいきません。
何とか回避する方法はありませんでしょうか?
0386nobodyさん03/02/23 01:21ID:???
意味不明。
0387nobodyさん03/02/23 01:26ID:???
(再挑戦)

Socketで&を含むURLをGETしようとしてるんですが、&amp; に展開されてしまってうまくいきません。
何とか回避する方法はありませんでしょうか?
0388nobodyさん03/02/23 01:28ID:???
リクエストはどうやって送ってるの?
038938703/02/23 01:30ID:???
$url = "test/read.cgi/php?1044717887";

my $SOCKET = new IO::Socket::INET -> new(PeerAddr => $hostname,
PeerPort => 'http',
Proto => 'tcp',
TimeOut => '5' );
print $SOCKET "GET $url HTTP/1.1\r\n";


ってな感じです。
0390nobodyさん03/02/23 01:39ID:???
&はどこで使っているのでしょうか・・・
039138703/02/23 01:42ID:???
またやっちまった。

$url = "test/read.cgi/php&1044717887";

my $SOCKET = new IO::Socket::INET -> new(PeerAddr => $hostname,
PeerPort => 'http',
Proto => 'tcp',
TimeOut => '5' );
print $SOCKET "GET $url HTTP/1.1\r\n";


ってな感じです。
(この$urlは実在しません)
039238703/02/23 01:46ID:???
これで、エラーが
 Invalid URI in request GET test/read.cgi/php&amp;1044717887 HTTP/1.1<P>
と出ます。
0393nobodyさん03/02/23 01:50ID:???
print $SOCKET "GET /$url HTTP/1.1\r\n";
0394nobodyさん03/02/23 01:53ID:???
>>387
$urlが間違っている。httpのRFC読んで出なおしたまへ。
039538703/02/23 01:53ID:???
>>393
あんりがとうございました。

目から鱗でした〜
039638703/02/23 01:55ID:???
>>394
後学のために、どこが間違いなのかヒントだけでも…
0397nobodyさん03/02/23 01:56ID:???
>>354
参考のためにOS教えて。
# truncateまでしたら、まず壊れないと思うけど。

参考のために。
use IO::File;
my $fh = IO::File->new("count.dat", O_EXLOCK|O_RDWR); # $fhがハンドル
で、ファイル開いてみてください(ただしWindows不可)。

>>387
展開されます?
>>392のサーバのエラーはHTML形式で出力されているようですが。
0398nobodyさん03/02/23 01:59ID:???
>>396
ファイル指定は、ドキュメントルートからのパスで指定しなきゃ。
039938703/02/23 02:11ID:???
>>398
だめだ。。。
意味わからん。出直します。。。
0400nobodyさん03/02/23 02:14ID:???
>>396

http://www.ietf.org/rfc/rfc2616.txt
5.1 Request-Line
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
5.1.2 Request-URI
Request-URI = "*" | absoluteURI | abs_path | authority

http://www.ietf.org/rfc/rfc2396.txt
3. URI Syntactic Components
abs_path = "/" path_segments

ここら辺を読んでくれたまへ。
0401nobodyさん03/02/23 12:17ID:???
米鳥で、htmlファイルを読み込んで編集して出力と言うスクリプトを書いたのですが、
ローカルではopenできるのですが、UPするとhtmlファイルがopenできません。

どうしたら良いでしょうか?
0402nobodyさん03/02/23 12:22ID:???
まずは質問の仕方を勉強して、
このスレの>>1-401を音読してください。
0403nobodyさん03/02/23 12:25ID:???
>>401
エラーメッセージを書け
0404nobodyさん03/02/23 12:41ID:???
>>380
まともなOSなら、まともなロックぐらいできるはずだ。

エラー処理とは...
全てのシステムコールに、or die($!);ってつけて、
eval BLOCK の中で実行してみろ。例外が飛んできたら(?)
$@に入るから、それを出せばいい。
0405nobodyさん03/02/23 18:05ID:???
Windowsで、メールを送信するプログラムのローカルテスト環境を作ることってできますか?
0406nobodyさん03/02/23 18:07ID:???
>>405
CGIだけど、なんか質問ある? Part 9
http://pc2.2ch.net/test/read.cgi/php/1041530204/
0407nobodyさん03/02/23 19:06ID:srUBO4KW
きく
0408nobodyさん03/02/23 19:08ID:???
あのう突然すみませんが、
私のプロバがヤフーBBで今書き込めなくて困っています。
どうしたら書き込みできるようになるんでしょうか。教えてください。
040940803/02/23 19:09ID:???
串を使っても書き込めないのですが......
0410nobodyさん03/02/23 19:14ID:???
>>408
プロバイダを変える。
あと、スレ違いの質問はよせ。
0411nobodyさん03/02/23 19:15ID:???
ファイルの中身を逆順に表示する方法はありますでしょうか。
リストに読み込んでリバースするとなると、メモリ容量が心配でして・・・
0412nobodyさん03/02/23 19:16ID:???
>>410
放置に限ります。
0413nobodyさん03/02/23 21:20ID:???
>>402-403
スクリプトは間違ってなかったのですが
鳥の仕様でスタ(cgi-bin以下のファイルは操作できない)

婆茶とかハイマしか触ったこと無かったので分からなかった(;´Д`)
■ このスレッドは過去ログ倉庫に格納されています