トップページ⇒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を見よう。
 
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
「さもなくば」と読めばいい。
0521nobodyさん02/05/06 09:14ID:???
>>475

どうすれば直りますか?
いちおうkent氏のカウンタで試したら普通にできたのに
なぜか俺が作ったのだと19→29、29→39になるんだるう
0522nobodyさん02/05/06 10:39ID:???
>>521
select(undef, undef, undef, 0.5);
これを
select(undef, undef, undef, 2);
か、もっと大きな数にするとなおんない?
0523pear ◆FRUIT8pk 02/05/06 11:25ID:???
>>517
どこが省略されてるの?
$logfileを読み込んで、読み込めなかったら&error;吐くようになってるだけでしょ?
0524nobodyさん02/05/06 11:30ID:???
>>523
普通は-eとかif混ぜて書くんでないの?多分
0525nobodyさん02/05/06 11:31ID:???
>>523

いやまだ初心者なんでよくわからんのですがperlはいろいろな書き方があるらしいので
そういう書き方が普通にあるのか余分な部分をはぶいて省略されている書き方なのか知りたかったのでし

if (!open(IN,"$logfile")) { &error; }

↑でもいいんですよね?
'||'ってifとかの条件判断のときにしか使わないものだと思っていたもんで。。
0526pear ◆FRUIT8pk 02/05/06 11:32ID:???
>>524
>>525の通り
0527nobodyさん02/05/06 12:14ID:???
ま、基本的に演算子だからねぇ。
print 3 + (2 > 1) * ('a' cmp 'b') - (1 | 2) * (3 && 4);#=> -10
052846502/05/06 12:24ID:???
>>465ですが直りました!

なぜか他のサイトで配布されているのはうまくいかないのに
処理がほとんど同じ俺がつくったやつは変な症状が出ていたので
動くほうのコードをちょっとずつ自分が作っているコードと入れ替えてみたら
なぜか動きました。。やっぱりキャッシュが壊れていたのかな?

ありがとうございました。御礼にあとで2ch用のアップロダうpしにきます
0529nobodyさん02/05/06 12:37ID:???
>>525
Cでもできるけど、普通の神経の持ち主ならやらないね。
標準的なスタイルってのが決まってるから。
main() {
0 || puts("a");
1 || puts("b");
0 && puts("c");
1 && puts("d");
}
Perlでは好んでやるね。やり方は一つではない、が信念だから。
0530nobodyさん02/05/06 14:40ID:???
Cでやらないのは処理系依存だからだと思っていたが、単なる習慣の違いだったのか?
0531nobodyさん02/05/06 15:30ID:???
>>530
そうかも。今、確認できる本がないのですまん。
0532nobodyさん02/05/06 16:26ID:usSooVS5
Perlのオーサリングツールって無いかなぁ〜
J++や、JBulderのIDE見たく、画面デザインと、
コードつなぎ合わせてくれて、ノンコーティングとまではいかないまでも
うまい事やってくれるツール
そんなうまい話無し?
0533nobodyさん02/05/06 16:34ID:???
>>530

処理系依存なのは f(a-1, ++a) の
どちらの式が先に評価されるか、じゃなかったかなぁ。
&&, || の評価順は保証されていたはず。

ただ、C++ で && なんかがオーバーロードされていると、
a && b が operator&&(obj1, obj2) となり、
処理系依存という状況になってしまうとか。
(More Effective C++, Item7 より)

>>532
Visual Perl とかどうなんだろう。使ったことないけど。
0534nobodyさん02/05/06 16:56ID:???
掲示板で半角スペースの連打や全角スペースの連打を弾くにはどうすれば良いのでしょうか?
半角スペースや全角スペースを1つのみを弾くのは簡単ですけど、、、。
0535nobodyさん02/05/06 16:59ID:???
( ゚д゚)
0536nobodyさん02/05/06 17:01ID:???
(´-`).。oO(>>534 /PATTERN/g)
053753402/05/06 17:05ID:???
>>536
それだと名前欄に1 1と書くと11となりますよね。
053853402/05/06 17:14ID:???
>>534
$hoge !~ / +/ && $hoge !~ / +/ && $hoge ne ''
0539nobodyさん02/05/06 17:18ID:???
>>538
全角スペースは文字コード体系に依存するからそれは正しくない

$hoge !~ /\s+/ && $hoge !~ /\x81\x40+/ && $hoge ne ''

これだと、shift-jis 専用になる
0540nobodyさん02/05/06 17:29ID:???
>>534=>>538 その自作自演、意味不明だよ・・・
0541nobodyさん02/05/06 17:30ID:KUbhtzR3
>>525
バカ
>>526
アフォ
>>528
うんこ
>>529
あひゃ
0542nobodyさん02/05/06 17:50ID:???
(´-`).。oO(誰が誰なんだか分からなくなってきた・・・)
0543nobodyさん02/05/06 19:03ID:???
>>541

ゴールデン厨登場〜
はやく糞コード書きにカエレ!
0544nobodyさん02/05/06 19:21ID:0erw8YvU
print SOCK "GET $path HTTP/1.0\r\n\r\n";
で使ったSOCKをもう一回
print SOCK "GET $path2 HTTP/1.0\r\n\r\n";
で使いたいんですが、一度closeしてsocket、connectしないといけないんでしょうか?
0545nobodyさん02/05/06 19:25ID:???
>>544
だね。
0546nobodyさん02/05/06 19:28ID:0erw8YvU
>>545
やっぱりそうですか。。。
重くなるかと思って・・・。
ありがとうございました。
0547nobodyさん02/05/06 22:56ID:???
>>442
ありがとうございます。
>>456
サーバーエラーになりました。
>>462
動きましたがindex.htmlファイルは置いていってくれませんでした。
自作なのでしょうか。こんなのをすぐに作れるのはすごいと思います。
054846202/05/06 23:19ID:???
>>547
親ディレクトリには戻れないので、できるだけトップディレクトリに
置いてね。
0549nobodyさん02/05/07 02:34ID:???
>>545
え、なんで?そのまま使えるんでは?
(そうじゃなきゃSocket pipeliningとかできないじゃん)
055054902/05/07 02:36ID:???
あ、よくみたら544が使ってるのはHTTP/1.0だった。すまん。
HTTP/1.1ならできるはず。
0551nobodyさん02/05/07 08:03ID:???

アプロダ用意しといたので誰か使うときになったら使ってね

http://popup3.tok2.com/home/program/

0552nobodyさん02/05/07 14:12ID:???
perlで書かれたCGIの負荷を数値でみれるソフトとかってあります?
0553 02/05/07 15:10ID:???
>>552
ありません。
無理です。
0554nobodyさん02/05/07 18:00ID:???
ベンチマークテストすりゃいいじゃん。
0555nobodyさん02/05/07 19:43ID:???
>>554

それは答えになってないミョー(ι´д`)
0556nobodyさん02/05/07 22:14ID:???
数字の入った変数に千単位でカンマを挿入したいのですが、
どのようにしたらいいでしょうか。
ちなみに最初の一つだけ挿入できました。
0557nobodyさん02/05/07 22:29ID:???
はいはい、超FAQ。perlメモでもみれ。
http://www.din.or.jp/~ohzaki/perl.htm#NumberWithComma
0558nobodyさん02/05/07 22:35ID:???
ありがとうございます。すごい!一行でできるんですね。
0559nobodyさん02/05/08 00:54ID:ZY3V1UfD
>>533

調べてみたけど、"Visual Perl"しかめっかんなかった

http://www.activestate.com/Products/Visual_Perl/

これ、おもろそう、トライアル版ダウンしてみる

ところで、Active Perlと普通のUnixのPerlってどう違うの?
0560nobodyさん02/05/08 14:33ID:???
csvファイルの中から任意の文字列を検索し、一致したデータを
一覧表示するというものをつくりました。
その結果表示は10件以上になると「次の10件」をクリック
すると11件以降のものが表示される、というようにしています。
ところが、例えば「大阪」というキーワードで検索すると、最初
の10件は正常に結果が表示されます。
しかし次の10件以降の検索結果表示がうまくでないのです。
どうやらキーワードの「大阪」が2度目以降の送信時に文字化け
して検索結果0件となり上手く検索ができないようなのです。
さらによくわからないのが、一度「検索結果0件」とでたあとに
ブラウザを再表示すると、正常な結果がでてくるのです。
(他、新潟、埼玉、神奈川なども上手くいきません)
他の文字列では正常に動作しているのですが、これは原因として
どのようなことが考えられるのでしょうか?
基本的なことなのかもしれませんが、宜しくお願いします。
0561nobodyさん02/05/08 19:45ID:???
的外れだったらごめん。前回の検索文字列は次のアンカーに書き出すときに
URIエスケープしてなくない?

printf qq(<a href="%s">次の10件</a>), URI_Escape($search_value);

### URIエスケープ文字列を返す
sub URI_Escape {
my($string) = @_[0];
$string =~ s/(\W)/'%' . unpack('H2', $1)/eg;
return ($string);
}
0562nobodyさん02/05/08 19:51ID:???
$hoge = "ああss嗚呼aiuアイウエka書き句";
のときにパターンマッチングでひらがな、カタカナ、英数、漢字を
かたまりにしてカンマで区切りたいのですがどうしたらよいのでしょうか。
希望出力結果としては

ああ,ss,嗚呼,aiu,アイウエ,ka,書,き,句,

としたいと思っています。入力はEUCで行っています。
どうもperlで漢字やカタカナを一文字ずつチェックする方法がわからなくて・・・。
Jperlを使わない方法では無理なのでしょうか?
0563nobodyさん02/05/08 19:53ID:???
間違った。しかも遅レスだから見てないな。
printf qq(<a href="$0?value=%s">次の10件</a>), &URI_Escape($QUERY{'value'});
0564nobodyさん02/05/08 21:35ID:???
>>562
何に使うのか教えてくれたらズバリなモジュールを教えるが。
056556002/05/08 21:47ID:???
>>561

ありがとうございます。
実はまだよくわかっていないんですが、とりあえずレスいただいた内容を
理解できるように調べることからはじめてみます。
■ このスレッドは過去ログ倉庫に格納されています