Perlコーディング初心者質問スレ Part 44
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/10/17(月) 00:47:17ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0404nobodyさん
2005/11/10(木) 06:43:00ID:???>でもあの書き方ではわかんないですよ。僕だけですかね・・・
おまいだけ。あと「supecial thnx」は恥ずかしいからやめておけ。
0406nobodyさん
2005/11/10(木) 10:11:45ID:???0407nobodyさん
2005/11/10(木) 10:52:53ID:CqV/pVhDビルダーとかみたいな
0408nobodyさん
2005/11/10(木) 11:38:03ID:???Perl書くのにどんなエディタ使ってる?
http://pc8.2ch.net/test/read.cgi/php/1014357485/
0409nobodyさん
2005/11/10(木) 22:41:58ID:???現在フォームメールを作っているのですが、どうもうまくいきません。
スクリプトの流れとしては、
(サブルーチンA)フォームデータの取り込み、デコード、データをハッシュ(%FORM)に代入。
ハッシュのデータをソートしてメールボディー用の変数($body。もちろんグローバル変数)へ代入。
↓
(メインルーチン)送信ボタンが押されたかチェック。
押されたら送信用のサブルーチンへ。
↓
(サブルーチンB)確認ページの表示。ハッシュのデータをソートして表示。
なのですが、確認ページで送信ボタン(キー名はsubmit)を押すとハッシュの中身はsubmitだけになってしまうし、$bodyはどこかへ消えてしまうし、どうにもさっぱりです。
どなたか導いてください。宜しくお願いします。
0410nobodyさん
2005/11/10(木) 22:44:24ID:???0412nobodyさん
2005/11/10(木) 23:53:03ID:???0413nobodyさん
2005/11/11(金) 00:15:11ID:???サブルーチンとか言ってるけど、ページの遷移はないってこと?
0415nobodyさん
2005/11/11(金) 08:59:41ID:???0416nobodyさん
2005/11/11(金) 18:22:32ID:???Perlでテキストファイルから1行ずつ読み込んで処理する時には
while(<>){}
で済みますが、
既に変数に入っているテキストを1行ずつ処理する場合、どうしたらよいのでしょうか?
0417nobodyさん
2005/11/11(金) 19:03:57ID:???0418nobodyさん
2005/11/11(金) 19:15:49ID:???テキストの内容がでかいとでかい配列ができちゃうのがイヤだけど、
foreach my $line (split(/^/, $txt)) {
# $line に何かする
}
0419nobodyさん
2005/11/11(金) 19:18:47ID:???レスありがとうございます。
>>418
すいません。splitの/^/というのは??
この場合の^は行頭を表す^ですか?
0422nobodyさん
2005/11/11(金) 20:30:27ID:???とかでも
0424nobodyさん
2005/11/11(金) 22:14:13ID:???ありがとうございます。
だいたいどんな事をやっているのか理解するのに
しばらくかかりました。^^;
オプションを使いこなせると便利になりそうですね。
0425nobodyさん
2005/11/11(金) 23:15:24ID:???原因は何でしょうか?
0426nobodyさん
2005/11/11(金) 23:23:21ID:???0427nobodyさん
2005/11/13(日) 16:57:21ID:???これを使ってBasic認証通過させたいんですが
鯖側の$realmが日本語になってるせい?なのか失敗します
アドバイスお願いします。。
0429nobodyさん
2005/11/13(日) 22:03:50ID:???文字コードがわからなければLWP::UserAgentのget_basic_credentialsを再定義して
$realmになに渡ってきてるのか調べてあわせてやればいいと思うよ。
0431nobodyさん
2005/11/14(月) 11:00:01ID:W63Ukjvmopen関数を使用して、UTF-8でテキストファイルに出力したいのですが
その方法がよくわからず困っています。
フォームから取得した変数はSHIFT_JISなので、
そのままopen関数で出力すると、テキストファイルの文字コードは
SHIFT_JISになってしまいます。
どなたか知っておられる方がいましたら、よろしくお願いします。
0433nobodyさん
2005/11/14(月) 17:51:10ID:WMignAMjつまり、やりたいことは、配列をランダムに並び替えることです。
0434nobodyさん
2005/11/14(月) 18:03:25ID:???http://boobar.hp.infoseek.co.jp/bench/randlist.txt
0435nobodyさん
2005/11/14(月) 18:12:42ID:???パフォーマンスなんて問題になってから考えれば良い。
気になるならそもそも Perl なんか使わんし。
0436nobodyさん
2005/11/14(月) 18:39:21ID:3zfzQPqEDLPass:1234
windowsでActivePerl5.8を使っています。
IO::Socketを使い、コンソールでのチャットを作ろうと思っています。
現在は、サーバー側はechoserverのプログラムを、
クライアント側にはプロセスを受信・送信に分けたものを使おうと思っています。
実行すると文字は入力できるのですが、うまくserver側にデータが行かないようです。
たぶん原因はclient側なんですが・・。
煮詰まってしまいました。。ヒントお願いします(つд⊂)
0437nobodyさん
2005/11/14(月) 19:04:07ID:???■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/
0438436
2005/11/14(月) 21:57:56ID:3zfzQPqEどんな本やwebページがオススメですか?
0440nobodyさん
2005/11/14(月) 22:09:16ID:???0442436
2005/11/14(月) 22:23:16ID:3zfzQPqEラクダもドキュメントも読んだけどよくわかんね^^;
神はー神はいないのかー>w<;
0443nobodyさん
2005/11/14(月) 22:33:57ID:???0444436
2005/11/14(月) 22:59:47ID:3zfzQPqE0445nobodyさん
2005/11/14(月) 23:09:56ID:???ラクダもドキュメントも読んだのに分からないのなら、Socket や
ターミナルを扱う為の基本的な知識が君には欠けている。
そしてその解説はこのスレの範疇ではない。
0446436
2005/11/14(月) 23:20:04ID:3zfzQPqE出直してきます。
0447nobodyさん
2005/11/15(火) 00:24:28ID:???0448nobodyさん
2005/11/15(火) 13:35:44ID:???0449nobodyさん
2005/11/15(火) 14:05:37ID:???0450nobodyさん
2005/11/15(火) 15:28:57ID:???Programming UNIX Socket FAQ in Japanese
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/
どちらもCを読めること。
0451nobodyさん
2005/11/15(火) 18:19:07ID:5cRd32ic現行
インターネット--------WEBサーバ(DBなど含む)
現行↑の単純な構成を
↓の構成(WEBサーバ3台、DBサーバとにしたいのですが、
イメージ
WEBサーバ1
インターネット--------ロードバランサ----WEBサーバ2--------Perlプログラム&DBサーバ
WEBサーバ3
この時にPerlのプログラム等に関して注意事項、不具合予測等はありますか?
0453nobodyさん
2005/11/15(火) 18:20:45ID:5cRd32ic現行
インターネット--------WEBサーバ(DBなど含む)
現行↑の単純な構成をロードバランサーを加えて
↓の構成(WEBサーバ3台、Perlプログラム&DBサーバ)にしたいのですが、
イメージ
WEBサーバ1
インターネット--------ロードバランサ----WEBサーバ2--------Perlプログラム&DBサーバ
WEBサーバ3
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つだけのハッシュがいくつか出来てしまうので
少しだけ空間効率が悪い。
まぁ、小さいから気にならないだろうけど。
■ このスレッドは過去ログ倉庫に格納されています