Perlコーディング初心者質問スレ Part 44
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/10/17(月) 00:47:17ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0455453
2005/11/15(火) 18:26:44ID:???退散します
0456nobodyさん
2005/11/16(水) 00:22:50ID:F5yPWKpZ0457nobodyさん
NGNG0458nobodyさん
2005/11/16(水) 01:49:10ID:???画像掲示板をCGI-Perlで作ったんですが、
アドレス先に画像が存在しているかどうかを判別する事は可能でしょうか?
0460nobodyさん
2005/11/16(水) 02:26:25ID:???0461nobodyさん
2005/11/16(水) 03:50:28ID:???0462nobodyさん
2005/11/16(水) 11:27:12ID:???マルチすんな
0463nobodyさん
2005/11/16(水) 13:37:18ID:???誘導されて来た、ってんだからマルチじゃないんじゃないの?そゆことじゃなくて?
>>458
リモートのサーバにある画像なら、HTTP でアクセスして存在確認する必要があるかと。
LWP とか使って HTTP で HEAD とか GET することになると思うけど、
具体的なやり方はまずぐぐって調べてみれ。
0464659
2005/11/16(水) 19:05:42ID:nAWFz8uaページャー機能(ページ送り)を加えたいんどえすが、
DBI::Pagerがレンタルサーバに入っていないため、
簡単は方法はないかと探してます。何か方法はありませんか?
pure perlなモジュールがあれば一番良いのですが。
0465nobodyさん
2005/11/17(木) 14:07:26ID:AgumOSx0更新記録CGIと検索CGIを別々に見つけてそれを合わせて実現させようとしています。
この中で「○円以内のもの」を抽出するというのをしたいんです。
ドロップダウンリストに
〜100円
101円〜200円
201円〜300円
〜〜
1,000円〜
という設定をしておいて、リストからその価格帯だけを表示させるという物です。
ドロップダウンリストに
<option value="1">〜100円</option>
<option value="2">101円〜200円</option>
<option value="3">201円〜300円</option>
として、普通にif文で
if($FORM{'data'} eq '1'){
if($data =< 100){ ; } else { next; }
}
elseif($FORM{'data'} eq '2'){
if($data => 101 && $data =< 200 ){ ; } else { next; }
}
〜〜
とすればOKなのでしょうか?(データには桁区切りのカンマが入ると思います。)
ほかによい方法がありますか?または、参考となるCGIがあれば同時に教えてもらえるとありがたいです。
0466nobodyさん
2005/11/17(木) 14:27:44ID:???>>1
>>7-8
【CGI】こんなCGI探してますver.18
http://pc8.2ch.net/test/read.cgi/hp/1123833110/
■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/
0467nobodyさん
2005/11/17(木) 14:32:54ID:AgumOSx0回答ありがとうございます。
自分で改造を考えているので、他のCGIを利用するとかすべてを作ってもらうわけでもないのですが、
ここじゃだめなんでしょうか?
0468nobodyさん
2005/11/17(木) 14:59:14ID:???>>1 を読めと。未来の話をせず、実際に躓いてから >>7-8 で
調べた上で質問しろと。
> 更新記録CGIと検索CGIを別々に見つけて
については >>466 。
> 自分で改造を考えている
については
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/
自作の部分に関してはココ。
0469nobodyさん
2005/11/17(木) 15:01:10ID:???データを array か hash に入れておき、grep 等で取り出せば OK。
ex.
my @data = (
{ name => 'a', price => 100, },
{ name => 'b', price => 200, },
...
};
...
my $lower = 100; # 実際は form から入力された値を検査し、代入。
my $upper = 200;
my @out = @data;
@out = grep { $_{price} >= $lower } @out if $lower;
@out = grep { $_{price} <= $upper } @out if $upper;
...
for (@out) {
print "$_{name}: $_{price}\n";
}
0471nobodyさん
2005/11/17(木) 17:05:22ID:vCe+doXklockfって実際どれくらいの実績があるのでしょう?
バージョンはいくつから使えるのでしょうか?
0472nobodyさん
2005/11/17(木) 17:37:43ID:???lockf という組込関数は perl に存在しない。
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlfunc.pod
perl の組込関数である処の flock() は標準 C ライブラリに用意
されている flock(2) か fcntl(2) か lockf(3) で実装されていて、
これらの関数が環境によっては NFS 越しのロック処理に対応
していない。なのでどんな環境で走らせるか決め打ちできない
場合は、システムコールレベルではなくスクリプトレベルでの
排他処理機構を用意する必要がある。
http://search.cpan.org/modlist/File_Name_System_Locking
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/
0473nobodyさん
2005/11/17(木) 18:11:47ID:+ypcUw74PHPの「setcookie($cookie,$setword,$expire);」で発行したCookieは、
CGI等で読み込めないのでしょうか?
0474nobodyさん
2005/11/17(木) 18:32:19ID:???ここは CGI スレではなく Perl のスレです。
△▲ WebProg 初心者の質問 Part12 ▼▽
http://pc8.2ch.net/test/read.cgi/php/1125215604/
CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/
0475nobodyさん
2005/11/17(木) 19:10:47ID:vCe+doXkありがと
0476nobodyさん
2005/11/17(木) 21:47:27ID:7TvwAtmaこの2ch型掲示板に表示されるIDを環境変数REMOTE_USERに一致させたいのですが
どうしたらよいでしょうか
sub id {
my($id,$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst,$month,$date,$identify);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$identify = substr($ENV{'REMOTE_ADDR'},-2).substr(crypt($ENV{'REMOTE_ADDR'},$year-$mon*100),2);
$id = crypt($identify,$mday."L");
$id = substr($id,-10);
return $id;
を
$id = $ENV{'REMOTE_USER'};
if ($id eq '') { $id = ":"; }
にしてみたりしたのですがよくわかりません。。
0477nobodyさん
2005/11/17(木) 21:55:58ID:???質問がよく分からん。
また、
> にしてみたりしたのですがよくわかりません。。
の、何がよくわからんのかよく分からん。
0478nobodyさん
2005/11/17(木) 22:02:17ID:???★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/
0479nobodyさん
2005/11/17(木) 23:05:58ID:???携帯用のフォームを作ってるんですけど
フォームから送信したデータって
当然、携帯のメモリ内にあるわけですよね?
あるフォームから送信、その先にもフォームがあり
そこからさらに今受け取ったデータも含めて新たなデータ送信と
要はどんどん送信するデータ増えていくわけですが
こういうのは問題ないのでしょうか?
どなたか教えてください。
よろしくお願いします。
0480nobodyさん
2005/11/17(木) 23:12:26ID:???△▲ WebProg 初心者の質問 Part12 ▼▽
http://pc8.2ch.net/test/read.cgi/php/1125215604/
0481nobodyさん
2005/11/17(木) 23:20:50ID:???0482nobodyさん
2005/11/18(金) 03:21:21ID:???0483nobodyさん
2005/11/18(金) 03:52:36ID:b/mBx1Hf%hash = (
'audio' => "オーディオ",
'video' => "ビデオ",
'cd' => "CD-ROM",
'dvd' => "DVD",
'bench' => "ベンチマーク",
'text' => "テキスト",
'bin' => "バイナリ"
);
の様に値をセットして
while(($k, $v) = each(%hash)){ print "$k = $v\n"; }
とか
foreach (keys(%hash)){ print "$_ = $hash{$_}\n"; }
ってやっても
'audio', 'video', 'cd', 'dvd' => "DVD", 'bench', 'text', 'bin'
の順番 (代入した順番) で出力してくれないんですけど、代入順での出力を
希望するなら
@list = ('audio', 'video', 'cd', 'dvd' => "DVD", 'bench', 'text', 'bin');
の様に“順番”を別で保持しておくしか無いんでしょか?
ちなみに上記のコードだと
audio
cd
bin
dvd
video
text
bench
の順番で出力されます。
0485nobodyさん
2005/11/18(金) 04:13:25ID:???標準モジュールじゃないからサーバで使えるかは疑問だけどFAQにこういうのがある
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_can_i_make_my_hash_remember_the_order_i_put_elements_into_it
これが使えないならデータ構造の工夫次第だろうな。
まあ、キーの順番を覚えておくのが一番簡単かと思う。
もしハッシュである必要性が無いなら…つまり$hash{$key}の形で使うことが無いなら、
こういう構造が考えられるね。
@list = (
['audio' => "DVD"],
['video' => "ビデオ"],
...
);
0486485
2005/11/18(金) 04:24:50ID:???補足
確認してみたらTie::IxHashはPure Perlだった。
そのままディレクトリ下にTie/IxHash.pmとして配置すれば動くよ
http://search.cpan.org/~gsar/Tie-IxHash-1.21/lib/Tie/IxHash.pm
ここのSourceからダウンロードね
0488nobodyさん
2005/11/18(金) 07:56:03ID:???'audio' => {index=>0, value=>"オーディオ",},
'video' => {index=>1, value=>"ビデオ",},
'cd' => {index=>2, value=>"CD-ROM",},
);
オレはこれでやってる。。
0489nobodyさん
2005/11/18(金) 10:58:48ID:???キーだけ受け取って値はハッシュから取った方が効率がいい。
0490nobodyさん
2005/11/18(金) 11:09:40ID:???普通に考えるとeachがせっかく返す値を捨てて値をハッシュから
とったらハッシュをひく手間がかかる分損しそうなものだが...
foreach (keys ...)でまわせって意味かな? それならわかる。
とりあえず論よりベンチ。
use Benchmark;
my %h = (1..2000);
timethese(undef, {
foreach => sub {
foreach my $k (keys %h) {
my $v = $h{$k};
}
},
each => sub {
while(my($k, $v) = each %h) {
}
},
each_key => sub {
while(my($k) = each %h) {
my $v = $h{$k};
}
},
});
Benchmark: running each, each_key, foreach for at least 3 CPU seconds...
each: 3 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 594.34/s (n=1890)
each_key: 3 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 470.68/s (n=1525)
foreach: 3 wallclock secs ( 3.21 usr + 0.00 sys = 3.21 CPU) @ 686.60/s (n=2204)
0491nobodyさん
2005/11/18(金) 11:32:55ID:???timethese(undef, {
foreach => sub {
foreach $k (keys %h) {
$h{$k};
}},
each => sub {
while(($k, $v) = each %h) {
$v;
}},
each_key => sub {
while(($k) = each %h) {
$h{$k};
}},
undef => sub {
while(($k,undef) = each %h) {
$h{$k};
}},
});
0492nobodyさん
2005/11/18(金) 12:18:06ID:???http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_each_HASH
my($k) = each %h も ($k) = each %h もリストコンテキスト。
my $k = each %h なり $k = each %h として計らないと意味無し。
0493nobodyさん
2005/11/18(金) 12:38:34ID:???OS : Windows XP
Ver: Active Perl 5.8.7 build 815
CPU: Athlon 1.6GHz -> 1.0GHzにクロックダウン
Mem: 256MB
ベンチマーク部>>491のものに>>492の修正を加えて使用
my %h = (1 .. $data_count*2);
データ数 2^2
Benchmark: running each, each_key, foreach, undef for at least 3 CPU seconds...
each: 4 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 142105.46/s(n=427169)
each_key: 2 wallclock secs ( 3.11 usr + 0.02 sys = 3.13 CPU) @ 138342.29/s(n=432458)
foreach: 2 wallclock secs ( 3.17 usr + 0.00 sys = 3.17 CPU) @ 118013.55/s(n=374575)
undef: 4 wallclock secs ( 3.13 usr + 0.01 sys = 3.14 CPU) @ 124147.58/s(n=390320)
データ数 2^4
Benchmark: running each, each_key, foreach, undef for at least 3 CPU seconds...
each: 2 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 42106.14/s (n=133687)
each_key: 3 wallclock secs ( 3.00 usr + 0.01 sys = 3.01 CPU) @ 40220.63/s (n=120863)
foreach: 4 wallclock secs ( 3.30 usr + 0.00 sys = 3.30 CPU) @ 48033.28/s (n=158750)
undef: 3 wallclock secs ( 3.10 usr + 0.00 sys = 3.10 CPU) @ 35960.05/s (n=111620)
データがごく少ない場合においてはeachでまわしたほうが若干速い。
でも2^3個程度までの話だしkeysをforeachで回したほうが良さそうだな
0494nobodyさん
2005/11/18(金) 15:29:22ID:???多くなるに連れて遅くなり7000個あたりでeach系に抜かれた。
list eachとscalar eachでは微妙にscalar eachのが速いが、
ループ内で値をたくさん使うならlist eachのがよさそう。
0495nobodyさん
2005/11/18(金) 15:42:17ID:???追試とまとめ。
http://boobar.hp.infoseek.co.jp/bench/hash.txt
0496493
2005/11/18(金) 16:18:46ID:???データ数1024よりも多くして実験してなかった・・・こちらでは2050付近で抜かれた
>>495
詳しい検証乙
データ数が増えるとkeysの戻り値の配列の大きさがネックになるわけか
0498nobodyさん
2005/11/18(金) 16:49:18ID:???こういうのはどこで言えばいいんだろ(´・ω・`)
0499nobodyさん
2005/11/18(金) 17:03:10ID:b/mBx1Hf@list = (['key' => 'val'], ...);
これで値をセットしたときってどうやって取り出すんでしょうか?
for(my($i) = 0; $i < $#list; $i += 2){
my($key, $val)= ($list[$i], $list[$i + 1]);
〜処理〜
}
って感じですか?
>>485, 486
ちょっと使い方を覚えてみようかな
>>488
そうやって値をセットしたときの取り出しはどうやるんでしょか?
0500nobodyさん
2005/11/18(金) 17:07:32ID:???その要求が通るとは到底思えないが、弾の人にでもメールしてみたらぁ?
>>499
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html
0501nobodyさん
2005/11/18(金) 17:25:13ID:b/mBx1Hf慣れるまでに時間かかりそうですが、ありがとうございました m(_ _)m
0502nobodyさん
2005/11/18(金) 17:35:46ID:b/mBx1Hf@list2 = (
{'audio' => "オーディオ"},
{'video' => "ビデオ"},
{'cd' => "CD-ROM"},
{'dvd' => "DVD"},
{'bench' => "ベンチマーク"},
{'text' => "テキスト"},
{'bin' => "バイナリ"}
);
foreach (@list2){
my($key, $val) = each(%$_);
print "$key => $val\n";
}
順番を保持しなくちゃならないときはこんな感じでいこうかなって思います。
0503nobodyさん
2005/11/18(金) 17:40:35ID:???ちなみに
>>485 みたいに配列使うなら
foreach my $elem (@list) {
my($key, $val) = @$elem;
}
で行ける。
>>502 のやり方だと要素が1つだけのハッシュがいくつか出来てしまうので
少しだけ空間効率が悪い。
まぁ、小さいから気にならないだろうけど。
0504nobodyさん
2005/11/18(金) 17:45:08ID:b/mBx1Hfおぉ〜、そのやり方のほうがスマートな気がする。
いやはや勉強になります。
0505nobodyさん
2005/11/18(金) 18:15:21ID:???「ハッシュはリストである」ということを知っていれば、簡単にわかる。
@foo = (1,10,2,20,3,30);
%bar = @foo;
print "$_ -> $bar{$_}\n" foreach keys %bar;
0506nobodyさん
2005/11/18(金) 18:15:31ID:lIGSV4IR【5.1登場】PHP時代到来 他言語終了【Perl即死】
http://pc8.2ch.net/test/read.cgi/php/1129715894/842
842 名前:nobodyさん[sage] 投稿日:2005/11/18(金) 18:05:46 ID:???
PerlはKE★Tの糞コードのせいで全てが終わった
0507nobodyさん
2005/11/18(金) 18:29:06ID:???続きはこっちでやって
http://pc8.2ch.net/test/read.cgi/php/1078991985/l50
いちいち解説してられないから
0509nobodyさん
2005/11/18(金) 18:32:14ID:EJTafLuMぐぐっても九行で書かれたP2Pしか出てこなくてorz
0510nobodyさん
2005/11/18(金) 18:53:23ID:???デバッグに必要なのは「P2Pアプリを作成するチュートリアル」ではなくて
Perl のマニュアルではないのか? >>7-8
0511nobodyさん
2005/11/18(金) 19:03:33ID:???すいません。やりたいことの整理が出来てませんでした。
新月作者がPerl版の開発を放棄してるので、余分な機能を付与しない掲示板だけのP2Pソフトを作りたいんです。
ただP2Pアプリを弄ったことがないものでどうしたものかなと。
ソース読んで改造するのがてっとりばやいにしても概念が分からないので・・
0512nobodyさん
2005/11/18(金) 19:09:55ID:???pdfで流れてる
0514nobodyさん
2005/11/18(金) 19:28:27ID:???概念や基本的な設計に関してはスレ違いだし、Google さんにでも
尋ねた方が早そう。具体的に Perl でのやり方となると改造ベース
が転がってるんだからソース読みながら学んだ方が効率いいわな。
コレだよね?
http://prdownloads.sourceforge.net/shingetsu/shingetsu-0.5b5.tar.gz
あと CPAN にはこういうのがあるね。
http://search.cpan.org/~klimkin/P2P-pDonkey-0.05/
0516nobodyさん
2005/11/19(土) 22:11:13ID:???0517nobodyさん
2005/11/19(土) 23:26:30ID:???0518nobodyさん
2005/11/20(日) 00:14:24ID:???インストール成功したかの確認方法ってありますか?
0521nobodyさん
2005/11/20(日) 00:20:29ID:???0522nobodyさん
2005/11/20(日) 00:47:10ID:???0523nobodyさん
2005/11/20(日) 01:29:36ID:q2W9WK5M0524nobodyさん
2005/11/20(日) 01:54:09ID:???0525nobodyさん
2005/11/20(日) 02:34:35ID:???変数名をループで作り出すにはどうすればいいのでしょうか?
my $chk0 = param('chk0');
↑の数字をforループでインクリメントして宣言するにはどうしたらいいでしょうか?
0527nobodyさん
2005/11/20(日) 19:45:49ID:???で、得点順に順位をつけるんだが、同点の場合同じ順位にし、次の順位は飛ばすって事ができなくて詰まっている。
現在は配列をforループし、$iをインクリメントして順位としている。
何かいい方法は無いだろうか。
0530nobodyさん
2005/11/20(日) 20:30:19ID:???既に回答を用意してる漏れがはっきり言ってやろう
> 名前1->得点1 名前2->得点2 っていうような配列があり
ここが意味不明。
以下に漏れが適していると考えたデータ構造とそのソースを貼ったるから
これで満足できないならちゃんと伝わるように説明汁
my %name2score = (hoge => 100, fuga => 90, hage => 100);
my %score2name;
foreach my $name (keys(%name2score)) {
push @{$score2name{ $name2score{$name} }}, $name;
}
my $rank = 1;
foreach my $score (sort {$b <=> $a} keys(%score2name)) {
foreach my $name (@{$score2name{$score}}) {
printf "%2d: %s(%3dpt)\n", $rank, $name, $score;
}
$rank += @{$score2name{$score}};
}
0531nobodyさん
2005/11/20(日) 20:35:37ID:???0532527
2005/11/20(日) 20:46:03ID:???thx
考え方さえわかれば後は自分で弄れると思いましたので、データ構造を適当に書いてしまいました。
申し訳ありませんでした。
あ、>>529は自分ではありませんので、念のため。
0536nobodyさん
2005/11/20(日) 21:01:02ID:???0537nobodyさん
2005/11/20(日) 21:23:44ID:???0538nobodyさん
2005/11/20(日) 21:32:49ID:???さっさと強制IDにしろよこの板
0539nobodyさん
2005/11/20(日) 21:33:46ID:???0540nobodyさん
2005/11/20(日) 21:35:51ID:???0542nobodyさん
2005/11/20(日) 21:39:20ID:???0544nobodyさん
2005/11/20(日) 21:41:55ID:???それよりム板も・・
0545nobodyさん
2005/11/20(日) 21:42:34ID:sql5orzi0547nobodyさん
2005/11/20(日) 22:45:33ID:Va/OuDM70548nobodyさん
2005/11/21(月) 01:50:14ID:???0549nobodyさん
2005/11/21(月) 02:08:53ID:???0550nobodyさん
2005/11/21(月) 02:12:55ID:???0551nobodyさん
2005/11/21(月) 03:36:00ID:m9z0lXWM純粋に順位を加えていく変数($i)と、状況に応じて順位を加えていく変数($j)の2つをつくる。
$iはループ中でひたすらインクリメントのみ。
$jは直前の人の点数と異なれば$iを採用する。 同じであれば$jをそのまま採用。
で出来ないかな?
0552nobodyさん
2005/11/21(月) 07:40:49ID:HZcu4vs3質問があります。
perlで$ENV{'PATH_INFO'}を取得しようとしていますが、
なぜか取得してくれません。
これはサーバー側の設定が影響しているのでしょうか。
ちなみに、他の環境変数については、正常に取得しています。
よろしくお願いします。
0554552
2005/11/21(月) 09:10:44ID:HZcu4vs3今やりたいことは、稼動中の掲示板の改造です。
$ENV{'QUERY_STRING'}からGETで取得している値を、
$ENV{'PATH_INFO'}から取得したいと思っています。
◆サーバー:ロリポップです。
◆コード
値を確かめるために、下のようなコードだけを記述したファイルを
アップし、適当な引数を付けてテストしていました。
print"Content-type: text/html\n\n";
print qq(
<HTML><HEAD><meta http-equiv=Content-Type content=text/html; charset=shift-jis>
</HEAD>
<BODY>
$ENV{'PATH_INFO'}
</BODY>
</HTML>
);
exit;
よろしくお願いいたします。
■ このスレッドは過去ログ倉庫に格納されています