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

【Perl】初心者コーナー Part13

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

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

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

CGIの質問は【CGIだけど、なんか質問ある? part 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あたりを見よう。
0478nobodyさん02/06/29 17:39ID:???
結論出すと、

while(<IN>) {
 @host = split(/<>/,$_);
 $host{$host[0]} += $host[3];
}

かな?
0479nobodyさん02/06/29 17:45ID:???
>>477
おいおい。まる2日分のなんや事を書けっていうのかちみは?
0480&r02/06/29 17:52ID:???
>478
そうだね。うっかりホスト毎ってのを見逃してた。修行してくる。
048147102/06/29 17:55ID:???
>>479
んーと別に大丈夫ですよ。質問の仕方が悪いのは僕の方です。
>>477
今まで答えて頂けたことは全て一通りやってます。
エラーは出ませんでした。出たとしても;を:と間違えた等その位です。
048247102/06/29 17:59ID:???
>>478
出来ませんでした。
048347102/06/29 18:02ID:???
>>478
host3の合計しか出ませんでした。
0484&r02/06/29 18:04ID:???
>482
ハッシュの参照のしかたわかる?
ファイルハンドルが478ではINになっているから統一しているか確認して、
とりあえず以下のようにして出力して確認されない?
for ( keys %host ){
    print $_,': ',$host{$_},"\n";
}
048547102/06/29 18:04ID:???
野郎℃も出来たぜ!!
Thanks!!!!!!!!!!!!!!!!!!!!!!!!
黄金帽と呼んでくれ!!!
0486nobodyさん02/06/29 18:06ID:???
@host1 = grep { /^name1<>.*<>.*<>.*<>/ } @_;
@host2 = grep { /^name1<>.*<>.*<>.*<>/ } @_;
@host3 = grep { /^name1<>.*<>.*<>.*<>/ } @_;

foreach(@host1){
m/^name1<>.*<>.*<>(.*)<>/;
$count1 += $1;
}

これじゃ非現実的だな。スマソ
048747102/06/29 18:07ID:???
>>485
??
>>484
出来ました。ご丁寧に説明をして頂きありがとうございました。
0488nobodyさん02/06/29 20:03ID:A6ruKh9P
B83W59H86(14歳)セルフヌード衝撃うp祭り開催中!!
http://tmp.2ch.net/test/read.cgi/mog2/1022943102/l50
0489nobodyさん02/06/29 20:32ID:YfnrInm/
perlからcの関数(*.aとかlibの)を使用する方法を教えてください。


0490nobodyさん02/06/29 20:40ID:???
>>489
ム板とWebProg板にマルチポストか。おめでてーな。
0491nobodyさん02/06/29 20:47ID:???
うるせえよ

>46 :デフォルトの名無しさん :02/06/29 19:00
>>>1よ
>だいたいPerl関連はWebProg板でやるきまりなんだよ
>そっちへ逝け
0492nobodyさん02/06/29 21:30ID:???
うがー。ム板のほうにレスつけちゃったよ。
じゃ490はマルチした罰として↓の48に答えること。命令。
http://pc.2ch.net/test/read.cgi/php/997829243/n48-
049349002/06/29 21:37ID:???
何故俺が罰を受けねばならんのだ…ウワァァァァン(`Д´)
049449202/06/29 21:41ID:???
ス、スマソ…。>>493
0495nobodyさん02/06/30 06:36ID:???
open関数が失敗するときは、
・ファイルが存在しない
・パーミッションがおかしい

以外にありえるのでしょうか、おねがいします
049649502/06/30 06:36ID:wtzA9nm5
あげときます
0497nobodyさん02/06/30 09:04ID:???
>>495
・メモリが足りない
・opcodeの実行が禁止されている
0498nobodyさん02/06/30 11:08ID:???
>>497
ファイルを開きすぎとかは?
0499nobodyさん02/06/30 11:54ID:???
>>498
そういえばそれもあるか
0500nobodyさん02/06/30 12:37ID:???

今だ!200番ゲットォォォッ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
     ∧∧   )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
        ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ

0501nobodyさん02/06/30 12:38ID:???
欝…番号間違えた(泣

>>495
あと、既にファイルが排他モードで開かれてるってのは?
0502nobodyたん02/06/30 14:21ID:???
排他モードで開くなんてのはあるのかな?
排他モードでロックしているというのはあるが。(その場合でも open は可能)
0503nobodyさん02/06/30 14:41ID:???
>>495
【Perl】ファイルロック(排他処理)について語ろう
http://pc.2ch.net/test/read.cgi/php/1024795138/
も参照してみては?
0504nobodyさん02/06/30 15:34ID:???
ここにいる人は>>492の質問には答えられないレヴェルなのですね。
ファイルロックなんてどうせ巷の解説サイトみればすむことなのに、、。
0505nobodyさん02/06/30 15:58ID:???
>504
492は質問ではなく誘導ですが…。
巷の解説サイトにあるファイルロックできみは納得して満足してるんだろうね。
そのサイト教えて。
0506nobodyさん02/06/30 16:50ID:???
>>505
>>3-4 ぐらい読め。バーカ
0507nobodyさん02/06/30 16:59ID:???
504=506?
だから、きみが納得して満足してるであろう巷の解説サイトを教えて。
どこ?
0508505 ◆EPPSxEpw 02/06/30 17:18ID:???
http://www.bayashi.net/st/pdmemo/filelock.html
↑適当にグーぐるしてください
 ファイルロックは専用のスレもあります
 >>504の解説してください。
0509nobodyさん02/06/30 17:36ID:???
>508
そのリンクってはじめて見させてもらったけど大崎さんのスクリプトに
なんで余計なプロセス番号($$)付けてあるの?積算秒を付ける意味を
理解できてないの?
これがきみの言う「巷の解説サイトみればすむ」ってこと?

504の解説:
>ここにいる人は>>492の質問には答えられないレヴェルなのですね。
505に書いたとおり、「492は質問ではなく誘導です」
0510nobodyさん02/06/30 17:46ID:???
> 付加する数字文字列がtime関数だと秒単位なので、
> まだ完全ではないのではないかという疑問が残ります。

何が疑問なのかが疑問です。
0511nobodyさん02/06/30 18:08ID:???
>510
この板でこのレスの速さは508さん自身のサイトだったってことかな?

ロックできるかどうかのテストと実際にロックする操作を同時に行なう
ことができる atomic な関数 を使っているからロックが成功するのは
1プロセスであり、そういう意味では同じ名前にロックファイル名に
リネームしてもよいということ。
ここで、なぜ積算秒を付け足したロックファイル名にリネームするかと
いうと、もしデッドロックが残っても作成してから60秒よりも経過して
いるかどうかを確認するからです。

つまりプロセス番号($$)を付ける意味がまったくわたしには理解できません。
0512nobodyさん02/06/30 18:19ID:???
>510
付け足すけどよく見たらさ。
ロック中ファイル名って、$lfh{path} . time . $$ だから
/^$lfh{basename}(\d+)/でマッチさせた $1 って time . $$ の値になる
可能性が大きいよね。(Windows系だと$$は-nnnnnnみたいな形式だったりする
けどさ)
でもその直後に平気で積算秒から $1 の値を引いてタイムアウト値と比較してる
からデッドロックをこれじゃ回避できないんでは?
0513508 ◆EPPSxEpw 02/06/30 18:49ID:???
あーわかったからファイルロックはあっちでやれ。
http://pc.2ch.net/test/read.cgi/php/1024795138/
どうせカウンターにしかつかっとらんのやろ。
ほかになんにファイルロックつかっとるのか知りたいDBとか?
>>508のサイトはgoogleでファイルロックで検索したら一番手前にあったから貼った。
------------------------------------------------
俺はXSについて聞いてんだ。
0514nobodyさん02/06/30 19:14ID:???
>513
カウンタ程度ならむしろ使わないほうがいいだろう。うっとうしい。
まぁ、使うとしたら電子商取引システムを構築するときに使うかもな。
さっきのアドレス、きみのサイトだったらなおしとけよ。はずかしいから。

きみの検索でほんとにさっきのサイトがトップでヒットしたんなら、検索能力を
養ってから吠えるこったな。まずこれでも見ておれ。

%perldoc -m perlxs
0515508 ◆EPPSxEpw 02/06/30 19:40ID:???
まぁ言い争いはよそうや(*゚ω^)ノ
この板に電子商取引システムを構築したりする人間がいるなら
XSぐらい楽勝だろ。
0516nobodyさん02/06/30 19:52ID:???
ロックスレの存在意義が今わかった。隔離病棟なんだね。。。

>>515
で、なに質問してるんだっけ。ていうかあなた質問者本人?
perlxstutの説明に沿ってHello Worldとか作ってみた?
0517508 ◆EPPSxEpw 02/06/30 20:00ID:???
>>516
見てもいまいち分からんとです。
解説サイトみても解説のみでサンプル載ってないし
0518japh ◆J.5V8ta6 02/06/30 20:56ID:???
>>517
perlxstutのサンプルじゃ不満だと?
http://www.kt.rim.or.jp/~kbk/perl5.005/

もっと突っ込んだサンプルが欲しいなら、
CPANから適当なXSモジュール落として参考にすれ
0519nobodyさん02/06/30 22:15ID:???
508はネタ荒らしか?天然か?
http://members.tripod.co.jp/ms_mzn/
0520pear ◆FRUIT8pk 02/07/01 05:54ID:???
$ENV{REMOTE_HOST} が返ってこないサーバーがあって、
問い合わせたら、「そんなことはない、ソース見直せ」って
言われたんですけど、このソースで表示されなかったらおかしいですよね?

#!/usr/bin/perl

print "Content-type: text/html;\n\n";

print "<html><body>";

foreach (sort keys %ENV){
print "\$ENV{$_}:$ENV{$_}<br>\n"
}

print "</body></html>";

exit;

これは何かこちらのソースに問題があるのでしょうか
よろしくお願いします。
0521nobodyさん02/07/01 08:04ID:???
>>520
HostnameLookups off
最近はデフォルトでオフだしね。
http://httpd.apache.org/docs/mod/core.html#hostnamelookups

CGIスレの方が良かったかも。
0522&r02/07/01 11:41ID:???
>520
なんでキーを出力させてないの? たしかにREMOTE_HOSTがない場合もありうる
だろうけど

print "$_: $ENV{$_}<br>\n"
0523pear ◆FRUIT8pk 02/07/01 12:27ID:???
>521
最近のapacheではホスト名は取得できないということでしょうか。。
>522
一応、キーは \$ENV{$_} で、表示されています。
0524nobodyさん02/07/01 15:00ID:???
特定の座標を中心とした5x5のマップを表示させたいのですが。
マップの情報が
123456789
123456789
123456789
123456789
123456789
123456789
123456789
とあってたとえば5,3だとしたら
34567
34567
34567
34567
34567
みたいな感じに表示させたいです。
でも、存在しない座標が含まれていたら表示しないようにしたいです。
参考になるようなページでもいいのでお願いします。
0525nobodyさん02/07/01 16:15ID:???
>>524
マップの外周に2マス分の余白を持たせるのはどうすかね。
余白は0とか-1とかの特別な値で埋めておく。
0526nobodyさん02/07/01 17:34ID:???
>>524
なんか宿題っぽいよなぁ・・・
まぁまずこういう構造体があったとして・・・

my @foo;
for my $idx1 ( 0..9 ) {
$foo[$idx1] = [];
for my $idx2 ( 0..9 ) {
$foo[$idx1][$idx2] = "$idx1$idx2";
}
}

で、まぁそしたらこんな感じか

sub print_matrix_range
{
my $matrix = shift;
my( $x, $y, $range ) = @_ ? @_ : (0,0,$#{$matrix});

my $xstart = $x - $range >= 0 ? $x - $range : 0;
my $ystart = $y - $range >= 0 ? $y - $range : 0;
my $xend = $x + $range <= $#{$matrix} ? $x + $range : $#{$matrix};
my $yend = $y + $range <= $#{$matrix} ? $y + $range : $#{$matrix};

for( my $curx = $xstart; $curx <= $xend; $curx++ ) {
for( my $cury = $ystart; $cury <= $yend; $cury++ ) {
print $matrix->[$curx][$cury],
$cury == $yend ? "\n" : ' ';
}
}
}

print_matrix_range( \@foo, 5, 3, 2 ); # 5=両方向に2マスだから

書き写しに失敗してないといいんだが。
0527質問です。02/07/01 21:51ID:X3MphqPi
今、HP作っているのですが、
この下のメタタグはどうゆう役割をするのですか?
御答えくださいませ。

<META NAME=robots CONTENT="http://**************/">
0528nobodyさん02/07/01 21:52ID:???
>>527
スレ違い板違い検索しろそして死ね
0529nobodyさん02/07/01 21:53ID:YKfyV+9J
同意
0530名無し募集中。。。02/07/01 21:55ID:POquGnWB
はじめまして。質問です。

perlを使って、Submitボタンを押さずにデータをcgiに受け渡すことって
可能でしょうか?
0531nobodyさん02/07/01 21:57ID:???
xxx.cgi?530=dqn&1=sine
これで出来るじゃん。
0532名無し募集中。。。02/07/01 21:57ID:POquGnWB
>>531

レスどうもです。
すいません、getじゃなくて、postっていうの忘れてました。
0533名無し募集中。。。02/07/01 22:03ID:POquGnWB
ムリなんかなぁ。。。
0534nobodyさん02/07/01 22:03ID:???
無理だと思われ。
0535名無し募集中。。。02/07/01 22:08ID:POquGnWB
>>574

マジっすか。さんくすこ。
あと、折角きたんでもう少し知恵貸して頂いていいっすか?
0536nobodyさん02/07/01 22:09ID:???
うむ。
0537名無し募集中。。。02/07/01 22:11ID:POquGnWB
やろうとしてるのは、シタラバで板の変更に際してスレッドを移動させたいんで
旧板のスレから名前とレス抜き出して、外部から新板にカキコ。

とりあえず、gabri dukeと外部のhtmlでsubmitおしての投稿は成功したんで
なんとかperlで自動的に書き込みって可能にならないっすかね?
0538名無し募集中。。。02/07/01 22:12ID:POquGnWB
>>536

どもです。537っす。読みにくい文章でスマソ。
0539名無し募集中。。。02/07/01 22:19ID:POquGnWB
ムリポでしょうか?
0540nobodyさん02/07/01 22:21ID:???
漏れにはわからないけど、ほかの人はわかるかも。
またーり待たれることを推奨する。
0541名無し募集中。。。02/07/01 22:23ID:POquGnWB
>>540
マターリ待ってみまふ。どもっす。
0542nobodyさん02/07/01 22:40ID:133+Yg1+
>>537
logファイルを移動するだけじゃダメなの。
0543nobodyさん02/07/01 22:42ID:???
手軽にPOSTするなら毎度おなじみLWP::UserAgentかな…。
perldoc lwpcook読んでみなはれ。
0544名無し募集中。。。02/07/01 22:43ID:POquGnWB
>>542
管理人が板放棄したんで糞スレ乱立、勝手に板移転するんす。。。

>>543
さんくす、調べてみるっす。
0545名無し募集中。。。02/07/01 23:09ID:POquGnWB

むずい、、、。postのcgi間のデータ受け渡しとLWP::UserAgentを
説明してるページ教えていただけると助かりまふ。おながいします。
0546nobodyさん?02/07/01 23:34ID:???
ttp://member.nifty.ne.jp/hippo2000/perltips/LWP.html
0547nobodyさん02/07/02 05:39ID:???
>526
なんかうまく言ってない気がします。

マップのデータを1行づつ配列につっこんでやればできるのだろうか…
0548nobodyさん02/07/02 07:25ID:???
>>545

自分のBBSに移すなら直接LOG弄ってアプ出来ないの?
つーか連続投稿如きでLWP使わなくて良いと思うけど
LixyとかChannnelとかの厨房ツール拾って来てそれ弄れば良いじゃん?
0549nobodyさん02/07/02 11:37ID:???
>547
「なんかうまくいってません」←コレ典型的な厨の応答だよ?
そんだけじゃ、読んでるこっちには何もわかんないのよ。
バカが直るまでお前は発言禁止。
0550nobodyさん02/07/02 12:05ID:uXcHDU9t
>>547
「だろうか…」 ←これもな。独り言を書くな。
0551nobodyさん02/07/02 12:54ID:???
>>547
それに加えて526のソースも厨だからしょうがないか。
0552nobodyさん02/07/02 14:32ID:???
>>544
ふつーLWPでGETしてログ再生成、んでもってうpだろうが。
0553nobodyさん02/07/02 15:50ID:???
>>549-550
すいません厨丸出しでした。
ちょっと質問の仕方を変えてみます。(526さんのだと特定の組み合わせしかだめっぽかったので)
マップデータが(例えばです。)
@map = (
'0000000000',
'1111111111',
'2222222222',
'3333333333',
'4444444444',
);
と入っている場合に>>524のようなことがしたいです。
0554nobodyさん02/07/02 17:11ID:???
>>553
部分マップを別配列に切り出す方向で考えてみた。

my $map_width = length($map[0]);
my $map_height = scalar(@map);

sub max { $_[$_[0] < $_[1]]; }
sub min { $_[$_[0] > $_[1]]; }

sub trim_map {
 my ($x, $y) = @_;
 my $x1 = max(0, $x - 2);
 my $x2 = min($map_width, $x + 2);
 my $y1 = max(0, $y - 2);
 my $y2 = min($map_height, $y + 2);
 return map { substr($_, $x1, $x2 - $x1 + 1) } @map[$y1 .. $y2];
}

my @mini_map = trim_map(5, 3);
print "$_\n" foreach @mini_map;
055555302/07/02 17:53ID:???
>>554
うまく動いてるみたいです。ありがとうございました。
0556nobodyさん02/07/02 18:08ID:???
みたい?(w
055752602/07/02 20:12ID:???
結局何がうごいてなかったんだ・・・だいたい一緒に見えるんだがなぁ。
0558nobodyさん02/07/02 20:46ID:???
初心者です。よろしくお願いします。

$host = $ENV{'REMOTE_HOST'};

で取得したホスト名$hostがaaa.bbb.ccc.dddとなっている場合に
bbb.ccc.dddの部分だけを表示する方法を教えてください。
0559nobodyさん02/07/02 21:20ID:???
=~ s/.*\.(.*\..*\..*)/$1/;
056055802/07/02 23:20ID:???
>559 さん

ありがとうございました。
0561nobodyさん02/07/02 23:33ID:???
($host)= $ENV{'REMOTE_HOST'}=~ /^[^\.]+\.(.*)$/;
0562nobodyさん02/07/03 05:04ID:???
1.更新履歴のページを作成しましたが、HTMLにして、更新の度に手を加えるのは面倒なので、cgiにしました。
第三者からは見れない入力ページから文章を打ち込み、公になるのはcgiが吐き出した更新履歴ページのみ。

2.で、スクールに通った時作成した、掲示板を改良したが、タグが禁止なのと、<br>が吐き出されて改行位置がおかしくなるので、
以下の処理を丸ごと削除しました。

foreach($text1,$cont){
s/&/&/g;
s/"/"/g;
s/</</g;
s/>/>/g;
s/\r\n/<br>/g;
s/\n/<br>/g;
s/\r/<br>/g;
s/,/、/g;
}

3.構文エラーはなく、動作はしますが、一行置きに改行が入ったり、更新する度に一番新しい記事が何度も表示されたり
と言った具合でお手上げです。超初心者ですみません。この部分だけでは判断できないものでしょうか?
何か解決策ありましたらよろしくお願いします。
0563nobodyさん02/07/03 05:36ID:???
それだけじゃ、良く解らないよ。取り敢えず、<br>の置き換えだけ残せや
それと、君の質問内容だと perl がほとんど解ってないように見受けられるし、
基本的な所から勉強しようという姿勢も見られないから、まともな解答を
得るのは難しいと思われ
0564nobodyさん02/07/03 12:09ID:???
>>562

s/**/**/g;
↑は確かに置き換えだが、置き換えられた結果がどこに行っちゃうのだろう。
0565nobodyさん02/07/03 12:18ID:???
$_
0566nobodyさん02/07/03 12:35ID:6OBUBtca
クエリーで送られてきた複数のvalueの値だけを切り出したいですが
うまくいきません。どうすればよいですか?

$buffer = $ENV{'QUERY_STRING'};
@buf = split( /&/ , $buffer );
foreach $data ( @buf ){
( $name , $value ) = split( /=/ , $data );
};
0567nobodyさん02/07/03 12:45ID:???
>>566
なんで初心者に限って自分でやろうとするのかね。
素直にCGI.pmかcgi-lib.plあたり使え!
0568nobodyさん02/07/03 12:45ID:???
$buffer = $ENV{'QUERY_STRING'};
@buf = split( /&/ , $buffer );
foreach $data ( @buf ){
( $name , $value ) = split( /=/ , $data );
$FORM{$name} = $value;
};
0569nobodyさん02/07/03 12:51ID:???
@list = values %FORM
0570nobodyさん02/07/03 13:02ID:???
cgi-lib.plのコードって効率悪いな。
もう過去の遺物か?
0571nobodyさん02/07/03 13:20ID:???
>>570
じらすためにわざと効率悪くつくってあることもしらないの?
057256602/07/03 13:20ID:6OBUBtca
>>567
なんと便利なものが・・・知りませんでした
勉強してみます。
>>568-569
それで漏れのヴァージン作品がやっと動きました。感激

Thanx ALL
057356202/07/03 15:37ID:???
>>563-564
どうもすいませんでした。
perlは確かに初心者ですが、何ぶん急いでたもので、、。
御指摘もっともです、すみません。もうちょっと初歩から勉強してみます。
ちなみに改行の件はperlの方ではなくhtmlの
<textarea>タグ内のwrap="hard"をとったら、解決しました。
出直してきます。
0574nobodyさん02/07/03 18:21ID:???
>>570

最適化してうpキボン










できればの話だけどね

0575nobodyさん02/07/03 20:49ID:???
>できればの話だけどね

( ´,_ゝ`)プッ
0576nobodyさん02/07/03 21:51ID:???
最適化なんかしないでそれくらい自分で書けよ。
書き方わかんなきゃ検索でもしてみろ。2510件ヒットしたぞ。

まぁ、ほとんどはたいしたこと書いてないページだが比較的ましなページが
3つほどあるだろう。
0577 ◆qXAQxUxI 02/07/03 22:59ID:???
>>570 == >>575

■ このスレッドは過去ログ倉庫に格納されています