Perlコーディング初心者質問スレ Part 45
■ このスレッドは過去ログ倉庫に格納されています
0001988
2005/12/08(木) 22:48:27ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0681nobodyさん
2006/01/14(土) 04:44:08ID:???#--- 設定
package Setup;
use strict;
sub get{
bless( {
foo => 1,
hoge => 2,
array => [1,2,3]
} , $_[0] );
}
1;
__END__
#!/usr/local/bin/perl
use strict;
use Setup;
my $setup => Setup->get;
print $setup->{'foo'};
print $setup->{'array'}->[0];
__END__
0682nobodyさん
2006/01/14(土) 05:58:58ID:???>>666
レン鯖です。
やはりタイムアウト的な処理でしたか。
それを避ける方法は御座いますでしょうか?
>>671
open(LOG,"$datfile");
while ( $data = <LOG> ) {
処理
}
close(LOG);
であってますでしょうか?
0683nobodyさん
2006/01/14(土) 06:19:45ID:???処理がどんなことしてるかは知りませんが、たかだか 800 行程度でタイムアウト起こすような
貧弱サーバーそのものの利用を考えたほうが良いのではないのでしょうか?
>671
個人的には foreach の方が perl らしくて好き
foreach my $logline (<LOG>){
〜処理〜
}
0684nobodyさん
2006/01/14(土) 06:32:02ID:???0685nobodyさん
2006/01/14(土) 08:03:10ID:???自分は 682 さんではありませんが、1つ勉強になりました。
thx
0687nobodyさん
2006/01/14(土) 09:37:38ID:???0688nobodyさん
2006/01/14(土) 09:39:12ID:???リンクを踏むと、メーラーが立ち上がるようになっています。
が、mailto: に subject と body を含めて、かつ body には改行を含めたいのですが、どうしてもエラーになってしまいます。
以下を含める場合、どのように書けばよいのでしょうか ?
<持込に関して> ← subject
↓本文
@お名前[改行]
@ご住所[改行]
@お電話番号[改行]
<問い合わせ内容詳細>
ソースは ShiftJISになっています。よろしくお願いします。
0689nobodyさん
2006/01/14(土) 09:39:30ID:???use LWP::Simple;
$url = 'http://girls.twistys.net/preview/';
for ($i=1; $i<=3; $i++) {
$num = sprintf("%03d", $i);
$_ = get($url.$num."/");
s/\w*\d{1,2}\.jpg/push @jpgs, $&/eg;
foreach $jpg (@jpgs) {
getstore($url.$num."/".$jpg, $num.$jpg);
}
}
0690nobodyさん
2006/01/14(土) 10:13:25ID:???このスレの質問じゃねぇし
http://www.ring.gr.jp/pub/doc/RFC/rfc2368.txt
mailto:[email protected]
?subject=%8E%9D%8D%9E%82%C9%8A%D6%82%B5%82%C4
&body=%40%82%A8%96%BC%91O%5B%89%FC%8Ds%5D%0D
%0A%40%82%B2%8FZ%8F%8A%5B%89%FC%8Ds%5D%0D%0A
%40%82%A8%93d%98b%94%D4%8D%86%5B%89%FC%8Ds%5D
%0D%0A%3C%96%E2%82%A2%8D%87%82%ED%82%B9%93%E0
%97e%8F%DA%8D%D7%3E
上を一行に合わせれ
0691nobodyさん
2006/01/14(土) 10:43:53ID:???> 処理がどんなことしてるかは知りませんが、たかだか 800 行程度でタイムアウト起こすような
その行について、どんな処理をしてるかわからないのに800行で判断する、っていうのはどうかと。
行数で判断するんだったら7万行で、に置き換えてください。そして、タイムアウトするのを避ける方法を教えてください。
なんかコンビニバイト風情が、肉体労働者に「一日働いただけで疲れるのはどうかと」って言ってるのと同じかな
0692nobodyさん
2006/01/14(土) 10:56:45ID:???> 〜処理〜
> }
こんな処理を800行「程度」を越える量書くとは…… 俺のレン鯖にいないことを願おう。
0693nobodyさん
2006/01/14(土) 10:57:54ID:???せめて70万行とかさ
0694nobodyさん
2006/01/14(土) 11:32:10ID:???ありがとうございます。
実は、同じようにURLエンコードして、おっしゃられたように入れてみたのですが、エラーになってしまうんです。
元に戻すとサーバエラーはでなくなるので、記述の仕方がどこか違うようなんですが
perl の独特な記述の仕方があるのかと思って書き込ませて頂きました。
0695nobodyさん
2006/01/14(土) 11:33:21ID:???0696nobodyさん
2006/01/14(土) 11:50:37ID:???多分、ダブルクオートで囲って @ や % が変数に展開されてるに一票。
0697nobodyさん
2006/01/14(土) 12:07:44ID:???別にforeachでも問題なかろう。
それで問題が起きるなら、それこそ鯖が貧弱。
0698nobodyさん
2006/01/14(土) 12:14:40ID:???見直すしかないでしょ
データの量(行数だけでは分からないだろ)も処理の内容も
分からねーのに、何か教えてほしいなんて無理
0699nobodyさん
2006/01/14(土) 12:36:49ID:???馬鹿のプロセス切るのは「鯖が貧弱」
だからじゃなくて管理がしっかりしてるからでしょ。
「問題」じゃまったくないし。
まぁ実際 32kb で切ってたら別の問題だけどね。
お前は書かないほうがいいよ。
0700nobodyさん
2006/01/14(土) 12:53:21ID:???∩___∩
| ノ ヽ/⌒)
/⌒) (゚) (゚) | .|
/ / ( _●_) ミ/
.( ヽ |∪| /
\ ヽノ /
/ /
| _つ /
| /UJ\ \
| / ) )
∪ ( \
\_)
0701nobodyさん
2006/01/14(土) 12:56:32ID:???使っているサーバがエラー番号などが出ない仕様なんです。
「サーバエラーが発生しました…」という文章しか出ないので。
確かにダブルクォートで囲って有ります。$vout に代入されているようなんですが…。
その場合はどうすればいいでしょうか ?
0702nobodyさん
2006/01/14(土) 13:23:01ID:???よいこの約束
0703nobodyさん
2006/01/14(土) 15:29:20ID:???ログが十分に小さければ、foreachとwhileの違いだけで、変わる状況なんて無いね。
仮に、それで問題が起きるなら、プロセス辺りのメモリ割り当てが
かなり小さいぐらいしか考えられない(鯖が貧弱)。
ってことなんだが(苦笑)。
4年書き続けてきたけど、もうだめぽか、ここも。
0704nobodyさん
2006/01/14(土) 15:36:47ID:???0706nobodyさん
2006/01/14(土) 16:33:57ID:???他人の管理下にあるサーバで実験しない。自分が動かしているサーバで
実験すれば、そのログを見てデバッグできる。
>>1に書いてある通り、エラーの内容も貼れないんじゃ質問以前の問題だ。
>>703
4年もいるんだったらスルーすることぐらい覚えろよ。
0707nobodyさん
2006/01/14(土) 18:00:04ID:???とか書いてある時点でダメに決まってるじゃん。
それとも4年前からこんな感じだったの?
0709nobodyさん
2006/01/14(土) 19:59:22ID:???普通こうする。読み込みなら文句なしに最強。
> foreach( @FILE )
いわずと知れたKEMT仕様。そして何故か入門者ご用達。
でも頻繁に書き込み(書き込みロック)が必要な場合好んで使う人も。
> foreach( <$FH> )
謎仕様。ファイル開きっぱなしで配列展開。KEMTもびっくり。
0711nobodyさん
2006/01/14(土) 21:02:12ID:???それでも逐次読み出しか一気にメモリに読み出してしまうかに大別できるでしょ
多分。
0712nobodyさん
2006/01/14(土) 21:10:27ID:???リファラのログを取ってて最大件数500件で、501件目が来たら古いリファラは削除して新しいリファラを追加するって処理の時に
現在が何件のログが貯まってるかを調べる時にはwhileだと一旦最後までループさしてカウンタをカウントアップさせて総数を得て、
その次にまたwhileで処理って感じになると思うんですが、
foreachでメモリに負担 なのと whileでDISK I/Oに負担とじゃ他のユーザーも同時に使ってるサーバー上ではどの処理がやさしいんでしょか?
今までforeachしか使ってなくてそれを否定された感があってちょっと自信難儀に陥ってまして助言とか意見があれば参考にしたいと思います。
0714nobodyさん
2006/01/14(土) 21:56:12ID:???Perlで二度アクセスするときのIOは気にする必要は小さなファイルであればいりません。
逆に、プログラムの中でキャッシング的な目的でメモリに読み込もうとすると
OS等の低レベルキャッシングとアプリケーションレベルのキャッシングが
物理メモリに配置されることになって、特別な事情がない限り非効率的です。
ちなみにそういうファイルを後から読み込みたいときは専用のモジュールがあります。
Text::Backwords (名前うろ覚え)
今回のケースではメモリ、IOともにもっとも効率がよくなるかと。
0715nobodyさん
2006/01/14(土) 21:59:37ID:???まぁ要は専用のモジュール使えって事で
0717nobodyさん
2006/01/14(土) 22:10:51ID:???さっさと処理を終らせてメモリを開放させてあげるほうが共用サーバでは重要だし。
0718nobodyさん
2006/01/14(土) 22:19:54ID:???どうもそこらへんわかってないやつが多すぎる。
0719nobodyさん
2006/01/14(土) 22:24:28ID:???「共有サーバーではそっちが重要」とか思い込み激し杉
0720nobodyさん
2006/01/14(土) 22:38:45ID:???細かい読み込み(しーく)も、鯖に負担かけるんじゃないの?
携帯も初期はそれで問題になったわけだし
良し悪しは良くわからんけど。
0721nobodyさん
2006/01/14(土) 22:44:26ID:???お前は全部分かってないな
0722nobodyさん
2006/01/14(土) 22:54:26ID:???0723nobodyさん
2006/01/14(土) 23:01:51ID:???システムのキャッシュが破棄されるほどの間隔をおいてアクセスする場合、
そんな長い時間アプリケーションレベルでメモリを確保しとくのは他のプロセスの邪魔。
そしてそのメモリの消費がさらにシステムのキャッシングを圧迫するという悪循環。
普通はアプリケーションレベルでは間欠・逐次的な読み込みでも。
OSがHDなどと協力してアクセスのあったファイルを物理メモリに先読みしてるので
間欠シークは発生しない。
「特定の状況下」で「ハードからソフトまでを知り尽くした」上でのキャッシングは
当然否定しないし、むしろ俺の理解の及ぶ範囲ではないが。
# 窓達だとデフォルトでディスクキャッシュ用メモリの確保量が少ないから効果あるかもね。
0725nobodyさん
2006/01/14(土) 23:16:26ID:???どこが違和感あるのか言ってもらえんと説明のしょうが……
0726nobodyさん
2006/01/14(土) 23:27:26ID:???理解が充分でない自覚がある場合はメモリを節約するアプローチで概ね間違わない気がするよ。
0727nobodyさん
2006/01/14(土) 23:30:48ID:???レン鯖で他のユーザの使用率とかも分からないのに
変に考えて小手先の技使ったって無駄ってことでは。
いまどきI/Oのアクセスをユーザが気にしなきゃならんOSなんて
レン鯖で使ってないよ。
しかも言語がPerlなんだよね。
頻繁に叩かれるスクリプトで、ガバッとメモリ喰うと
そっちの方でディスクにアクセスがかかるかも知れないってのを
心配してるんじゃないのかな。
0728nobodyさん
2006/01/14(土) 23:36:57ID:???while( <$fh> )も結局は物理メモリのキャッシュから読み込んでる訳で、
遅くないから心配するなと。
0729nobodyさん
2006/01/14(土) 23:39:43ID:???それで済むならいいけどさ
0730nobodyさん
2006/01/14(土) 23:40:09ID:???0731nobodyさん
2006/01/14(土) 23:49:08ID:???便利・不便じゃなくてシーケンシャルアクセスをどうやるかでしょ。
foreach( @ ) も foreach( <> ) もやりたい事は(多くの場合)シーケンシャルアクセス。
0732nobodyさん
2006/01/14(土) 23:50:31ID:???プロセスがプロセスキューに溜まる事だと考えてる。
ファイルリードより、スワップの方がコスト高そうだし。
だから、なるべく早くロックを開放することを考えてるよ。
でも、実際そこまで厳しい状態はほとんど知らないし、
そこまで考える必要があるかどうかは分からんけど。
0733nobodyさん
2006/01/15(日) 00:01:11ID:???0734nobodyさん
2006/01/15(日) 00:04:02ID:???書き込み頻度低いってことでしょ?
(そうじゃなきゃ編集衝突するよね?)
メモリに展開する必要ないじゃん。
0735nobodyさん
2006/01/15(日) 00:04:24ID:???NASとか使ってると、鯖の構成とか製品によっては
フロントの鯖から、ロックファイルが見えるまでにタイムラグがあったりする。
0736nobodyさん
2006/01/15(日) 00:04:59ID:???読んでいった感じ、「メモリには優しく」 というのを感じました。
ただまた1つ疑問がw
DB 使ってるとして、巨大なテーブルが戻ってきちゃう場合はどうするんでしょ?
さすがにこれはしょがないんでしょうか・・・
0737nobodyさん
2006/01/15(日) 00:07:52ID:???0738nobodyさん
2006/01/15(日) 00:08:55ID:???1. DB に処理できることは DB にやらせる
2. 表示なら巨大なものは最初から表示できないから無駄なものは取得しない
いずれでもない場合ってこと?
0739nobodyさん
2006/01/15(日) 00:15:22ID:???普段どうやってDBアクセスしてるの?
まさか一度二次元配列にぶちこむとかやってないよね?
0740nobodyさん
2006/01/15(日) 00:21:05ID:???いやDBは使ったこと無いです(興味あるっちゃありますが・・・)
>737,738
たとえば得られたテーブルが (巨大とはいえないけどとりあえず) 5項目程度で1000行だとして、
SQL文で500行目〜700行目だけ欲しいっていうことって出きるんですか?
出来るならそれで解決なんですが ^^;
0742nobodyさん
2006/01/15(日) 00:29:05ID:???0743nobodyさん
2006/01/15(日) 00:32:01ID:???0744nobodyさん
2006/01/15(日) 00:39:40ID:???なるほろ。 解決しました
thx
0745nobodyさん
2006/01/15(日) 00:40:24ID:xHRm9xcdsql limit offsetあたりをキーワードに検索をかけると幸せになれるぞ。
つか、スレ違いっぽいな。
0746nobodyさん
2006/01/15(日) 01:00:08ID:???0747nobodyさん
2006/01/15(日) 01:05:57ID:a4Y6+QOPそんなつまらん事なら書き込むな、このボケ。つか志ねよ。
0749nobodyさん
2006/01/15(日) 13:13:53ID:???-sample.html-
<html>
<head>
<!--#exec cmd="sample.pl"-->
こんにちは
</body>
</html>
-sample.pl-
print"<title>sample</title>\n";
print"</head>\n";
print"<body>\n";
…これって良いのでしょうか?
Perlのパスも記述せず、文法的にも…
一応ちゃんと動作してるんですが、何か物凄く間違ってる気がしてなりません…。
0750nobodyさん
2006/01/15(日) 13:27:44ID:???利点が分からないなら無理して使う必要はないし、お好みでどうぞ。
ちなみにCGI.pmは標準でインストールされていて、もし入っていなくてもCPANから落として@INC内に入れれば使えます。
# モジュールが重いとか言っていたら、DBIもJcodeもutf8も使っていられませんよ。CGI.pmが重いなら、MovableTypeを使うなんて論外ですね。
0751nobodyさん
2006/01/15(日) 13:41:01ID:???0752nobodyさん
2006/01/15(日) 14:35:28ID:???0753nobodyさん
2006/01/15(日) 14:59:53ID:???0754nobodyさん
2006/01/15(日) 16:34:25ID:???またおまえ「ら」かよ。いい加減なんちゃってモジュール使いたいがために
さるみたいにCGIモジュール直接読み込むのやめろ。な?
しかもそれで知ったかで質問にレスするし。
最悪。
0755nobodyさん
2006/01/15(日) 16:41:10ID:???のは分からなくもない(やりたきゃ自分でサーバ用意して mod_perl や
fastcgi でやれってこと)が、それならそれで適切な表現てもんが
あると思うがな。
0756nobodyさん
2006/01/15(日) 16:43:02ID:???それでいいじゃん
〜終了〜
0758nobodyさん
2006/01/15(日) 16:47:29ID:???まぁCGIモジュールしか知らないなら使わないのは正解かもね。
0759nobodyさん
2006/01/15(日) 16:50:52ID:???共有サーバーでみんなが右も左も解らず無駄にCGIモジュールをロードしたらどうなると思う?
0760nobodyさん
2006/01/15(日) 16:54:23ID:???0761nobodyさん
NGNG0762nobodyさん
NGNG0763nobodyさん
2006/01/15(日) 17:25:16ID:???結局クエリ読み取るときにはどうすればいいんでしょうか。
教えてください。
0765nobodyさん
2006/01/15(日) 17:37:39ID:???えらい遠回りな
0767nobodyさん
2006/01/15(日) 18:30:31ID:???迷うならCGI.pm使う。
パフォーマンスを追及したかったら思ったらCGI::minimalをインスコして使う。
根拠はperlfaq9
http://www.kt.rim.or.jp/%7Ekbk/perl-5.8/perlfaq9.html#how_do_i_decode_a_cgi_form
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq9.html#How_do_I_decode_a_CGI_form_
0768nobodyさん
2006/01/15(日) 19:24:47ID:???0769nobodyさん
2006/01/15(日) 19:54:25ID:???0770nobodyさん
2006/01/15(日) 20:39:21ID:???0771nobodyさん
2006/01/15(日) 20:41:22ID:???0772nobodyさん
2006/01/15(日) 20:45:26ID:???binmode(STDIN);
if($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else{
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$in{$name} = $value;
}
}
スクリプト書くたびにコレを書いてる
マルチプル、マルチパートなんて使わないのでこれで十分事足りてる
0773nobodyさん
2006/01/15(日) 20:57:56ID:???590 549 sage 2006/01/13(金) 12:44:01
>>568
説明すると長くなるから
ttp://perldoc.jp/docs/perl/5.6.1/perlfaq9.podの
How do I decode a CGI form?の項を1000回読め。
とほほのコードがどうしてまずいのかがよ〜く解るだろう。
ついでにCGI.pmはpure perlだから読んでみるとよかろう。
もし君が解読しきれなくても本当に正しくフォームデコード
するというのはどんなに大変なことなのかぐらいは解るだろう。
CGI/util.pmのunescapeメソッドを読むだけでも君は
ここで「とほほのコードはWebProg板では普通のコード」
と言い切ってしまったことをとても恥ずかしく思うようになるはずだ。
cgi.pmのマニュアルがよく解らないというのはオブジェクト指向や
参照渡しがよく解ってないからじゃないのかな。
cgi.pmにはcgi-lib.plもどきの関数インターフェースもあるので
Webを漁って探してみてくれ。日本語訳もあるよ。
まあ頑張れ。
0775nobodyさん
2006/01/15(日) 21:22:56ID:???エラーチェックしなかったら、どうなるんだってのw
0776nobodyさん
2006/01/15(日) 21:30:59ID:???0777nobodyさん
2006/01/15(日) 21:34:52ID:???0778nobodyさん
2006/01/15(日) 21:35:18ID:???0779nobodyさん
2006/01/15(日) 21:37:12ID:???■ このスレッドは過去ログ倉庫に格納されています