Perlコーディング初心者質問スレ Part 51
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/07/27(木) 17:04:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0362nobodyさん
2006/08/08(火) 13:25:42ID:???そのままだとユーザビリティに反するので答えてくれないかもしれないが
0364nobodyさん
2006/08/08(火) 23:25:32ID:???ラジオボタンの制御がうまくいきません。
どういうことかというと、
フォームに必要項目を入力してもらい、確認ボタンを押した後、
入力項目にエラーがあると修正ボタンが表示され、
修正をしてもらうという仕組みなのですが、
修正ボタンを押して入力フォームに戻ると、ラジオボタンが選択していた
状態ではなくなり、デフォルトの状態にもどってしまいます。
修正ボタンを押した後に、ラジオボタンの位置を、選択した箇所のまま表示させるには
どのような処理を行えばいいのでしょうか?
どなたかご教授お願い致します。
修正画面までラジオボタンのデータが渡っていることまでは確認済みです。
0365nobodyさん
2006/08/08(火) 23:33:10ID:???0366nobodyさん
2006/08/08(火) 23:50:03ID:???早速アドバイスありがとうございます。
HTMLのソースが下のような感じです。
input name="genre" type="radio" value="1-1">
input name="genre" type="radio" value="1-2">
input name="genre" type="radio" value="1-3">
この行一行一行を「m//」でvalueが一致するか調べて
一致したら、「s///」で行ごと置換すればいいのでしょうか?
0367nobodyさん
2006/08/09(水) 00:02:59ID:???これとかだな。
http://search.cpan.org/~nwclark/perl-5.8.8/lib/Term/ReadLine.pm
0368nobodyさん
2006/08/09(水) 00:16:15ID:???0369nobodyさん
2006/08/09(水) 02:28:37ID:2nlyYTa7データの書き込み処理に躓きました・・・。ヒントを下さい・・・。
$hogeに、「5」という数字が入っているとします。
そしたら、下記の「log.dat」の「番号5」の値の投票結果を「+1」していきたいのです。
つまり、「$hogeに入った数字と、log.datの『番号』の値を比べて、同じなら『投票結果』の値を『+1』する」
というスクリプトを組みたいのですが・・・・。
ログファイル(log.dat)の中身は以下の通りです。
番号 投票結果
-----------------------
1 10
2 20
3 26
4 30
5 10
-----------------------
どうか、よろしくお願いします。
0370nobodyさん
2006/08/09(水) 03:32:28ID:???0371369
2006/08/09(水) 03:40:54ID:eB/zZqiVありがとうございます。かなり複雑っすね・・・。
たびたび申し訳ありませんが、自分には何のこっちゃか・・・ orz
0372nobodyさん
2006/08/09(水) 04:05:06ID:???人間が見やすいようにするんじゃなくて
perl様が見やすいようにする
つか、他人の作った投票スクリプトを読み下せ
0373nobodyさん
2006/08/09(水) 04:32:22ID:WfKDVGHV[0-9]{1,3}では999までヒットしてしまいます。
ループもさせたくないのですが、、
0374nobodyさん
2006/08/09(水) 05:06:26ID:???0375nobodyさん
2006/08/09(水) 06:10:08ID:???そう書くのは割りと普通じゃないの?
簡単なログファイルでいいのならたぶん俺もそう書く。
open (略); read(略); %data = split(/\s+/);
だけでもデータとれるし。
>>369
+1 して保存するときは普通に。
$data{5}++;
foreach (sort { $a <=> $b } keys %data) { print 略 $_, "\t", $data{$_}, "\n"; }
close (略);
>>370 は結構トリッキーな書き方だね。 (.*)$ の部分はどうして必要なのかちょっとわからなかったけど。
0376nobodyさん
2006/08/09(水) 07:14:26ID:???>>372が言っているように、ログファイルの書式を見直すべし。
1, 2, 最終行 は不要。もし入れたいならコメントと分かるように工夫を。
余分なスペースも不要。
ログファイル例:
1 10
2 20
3 26
4 30
5 10
> 「番号5」の値の投票結果を「+1」していきたい
いったん全部読みこんで、5の値だけ変えて、全部書き出す。
0377nobodyさん
2006/08/09(水) 07:22:05ID:???0378nobodyさん
2006/08/09(水) 10:40:29ID:???ログファイル例:
10
20
26
30
10
で、十分。あとは、
open fh,$log;
@dat=<fh>;
close fh;
chomp @dat;
$dat[$hoge - 1]++;
open fh,">$log";
print fh join "\n",@dat;
close fh;
で、どうぞ
0379369
2006/08/09(水) 12:22:14ID:???0381378
2006/08/09(水) 13:27:12ID:???えっと、自分は試して書いてますが・・・
最初chompとjoinは書いてませんでしたが、それだとうまく行かなかったので足しました・・・
なので、その辺がちょっと冗長かも・・・
0382nobodyさん
2006/08/09(水) 13:29:07ID:???0383nobodyさん
2006/08/09(水) 13:31:01ID:???0384nobodyさん
2006/08/09(水) 14:05:56ID:???0385nobodyさん
2006/08/09(水) 16:08:49ID:???-------------------------
10
20
26
30
10
-------------------------
のようなログがあった場合、この数字を全て足していきたいのですが、
-------------------------
open(LOG," $log");
@logs=<LOG>;
close(LOG);
for ($i = 0; $i <= $#logs; $i++) {
$count += $logs[$i];
}
-------------------------
で、大丈夫でしょうか?
ひょっとすると、forよりforeachやwhileを使ったしたほうがよろしいのでしょうか?
アドバイスよろしくお願いします orz
0386nobodyさん
2006/08/09(水) 16:28:35ID:???0387385
2006/08/09(水) 16:33:48ID:???ただ単に、ログの合計値を求めたいだけなので、「$i」は使わないっすね・・・。
そうすると、foreachでしょうか?やり方は分からんですが・・・。
0388nobodyさん
2006/08/09(水) 16:49:10ID:???0389nobodyさん
2006/08/09(水) 17:32:59ID:???関数すら調べようとしないなんてなぁ。
素直に「夏休みの宿題です」と言えば、まだかわいげがあるのに。
0390nobodyさん
2006/08/09(水) 17:34:59ID:???0391nobodyさん
2006/08/09(水) 17:40:58ID:???0392nobodyさん
2006/08/09(水) 17:57:13ID:WfKDVGHVありがとうございます
0393nobodyさん
2006/08/09(水) 18:01:38ID:WfKDVGHV行が多いならメモリ節約のために1行づつ読んだほうがいいですよ。
排他したいならflockをした上で、いったんテンポラリファイルで保存してリネームがいいです。
0394nobodyさん
2006/08/09(水) 18:13:32ID:???foreach(@logs){
$count += $_;
}
while(<LOG>){
$count += $_;
}
下のほうが推奨されるやり方。
どちらにせよ10 + "15\n" == 25 という危ない等式を使っているので、
ほかの言語でやるときは注意が必要
0395nobodyさん
2006/08/09(水) 19:56:07ID:???そうか?
俺も結構ゴリゴリ書くから、こうゆう細かい事は極力気にかけてるぉ
>>394
ん?「10 + "15\n" == 25」って何がマズイんだ?
0396nobodyさん
2006/08/09(水) 20:06:22ID:???0399nobodyさん
2006/08/09(水) 21:27:42ID:lhGjc7IL銘柄コードを1000から9999までループさせ銘柄名を取得するのですが、
ループの回数が少ない場合正常終了するのですが全件やると半分ぐらいまで書き込みが完了した所で
Premature end of script headers
のエラーになってしまいます。
ファイルへの書き込みがタイムアウト?しているのかと思い1000件毎に、CLOSEしてOPENしなおしても変化ありません。
何回かに分けて処理したほうが良いのでしょうか?
次でソースのせます。
0400nobodyさん
2006/08/09(水) 21:33:52ID:lhGjc7ILclose(FILE);
open(FILE, ">>$name_data");#追加書き込みでファイルオープン
eval{ flock(FILE, 2) };
for($i = $start_code ; $i < $end_code ; ) {
$cd = sprintf("%04d",$i);
$url="ヤフーのURL";
$dt=get($url);
@data = split(/\n/,$dt);
$j = 0;
while($j < @data) {
if(銘柄名の行になったら){
$sk = $data[$j];
$sk =~ s/\<b\>//g;#ごみ取り
$sk =~ s/\<\/b\>.+//g;#ごみ取り
$sk = jcode::sjis($sk);
$sk =~ s/\(株\)//g;#ごみ取り
print FILE jcode::sjis("$cd\,$sk\n");#書き込み
$j = 100000#終わりなので抜ける
}
++$j;
}
++$i;
if(substr($cd,1,3) eq "000"){
close(FILE);
open(FILE, ">>$name_data");#タイムアウト防止で1000毎に書き込み
eval{ flock(FILE, 2) };
}
}
close(FILE);
こんなです。よろしくおねがいします
0401nobodyさん
2006/08/09(水) 21:43:24ID:???0402nobodyさん
2006/08/09(水) 21:43:42ID:???0403nobodyさん
2006/08/09(水) 21:52:32ID:???ApacheならTimeout値の見直しとか。
共有サーバなら逝ってよし。
0405nobodyさん
2006/08/09(水) 23:20:10ID:???株価データの著作権とかの問題を言ってる?
0406nobodyさん
2006/08/09(水) 23:38:58ID:???$dt=get($url);
ってヤフーのデータを読みに行ってるんだよね。
これがforループの中にある事に不吉な気配を感じる。
$iの値は1000から9999まで1ずつ増えるんだよね?
0408400
2006/08/10(木) 00:30:08ID:???タイムアウト値を300から2000に変更したところ全て正常終了できました。
ありがとうございます。
>>401、>>404
プログラミングのお作法についてなのか
著作権の問題かどちらかでしょうか?
ネット上に公開されているデータを収集しファイルに落とすことが問題?
会員用のデータを公開したり勝手に売ったりしたら問題だとは思いますが・・
0409nobodyさん
2006/08/10(木) 00:58:21ID:???>402-403のことで解決したってた。
解決策も提案できないチンカスは早く寝ろや
>404
サーバーに負担かけすぎなので、出来れば一定間隔でsleep入れて相手のサーバーを思いやるか、
特定銘柄のみの取得にするといいかも。
0410nobodyさん
2006/08/10(木) 00:58:52ID:???2個目は400さんへだ。
0411nobodyさん
2006/08/10(木) 02:31:33ID:???>著作権の問題かどちらかでしょうか?
どちらでもありません。ただ死んでください。
0412nobodyさん
2006/08/10(木) 02:57:32ID:???このへんの板も ID つかねぇかなー
0413nobodyさん
2006/08/10(木) 07:28:55ID:???下手すると威力業務妨害とかで訴えられるんじゃね?
0414nobodyさん
2006/08/10(木) 07:45:54ID:???0415nobodyさん
2006/08/10(木) 08:40:23ID:???0416nobodyさん
2006/08/10(木) 08:55:45ID:???いいかげんめんどうじゃないですか?
最近はPerl限定ならStorableにハッシュ突っ込んで終わりにしてます。
0417nobodyさん
2006/08/10(木) 09:20:20ID:???むしろPerl依存の形式にしちゃうほうが後々めんどくさそう・・・
0418nobodyさん
2006/08/10(木) 10:27:13ID:???{
test_a => q{
my $a = 0;
for (my $i = 0; $i < 100000; $i++) {
$a++;
}
},
test_b => q{
my $a = 0;
foreach (1 .. 100000) {
$a++;
}
}
}
);
Benchmark: timing 500 iterations of test_a, test_b...
test_a: 12 wallclock secs (11.63 usr + 0.00 sys = 11.63 CPU) @ 43.01/s (n=500)
test_b: 9 wallclock secs ( 9.63 usr + 0.00 sys = 9.63 CPU) @ 51.95/s (n=500)
0419nobodyさん
2006/08/10(木) 10:44:47ID:???use Benchmark;
my @arr = (1 .. 100000);
timethese(1000, {
test_a => sub {
my $n = 0;
for (my $i = 0; $i < @arr; $i++) { $n++; }
},
test_b => sub {
my $n = 0;
foreach (@arr) { $n++; }
},
test_c => sub {
my $n = 0;
for (@arr) { $n++; }
},
});
Benchmark: timing 1000 iterations of test_a, test_b, test_c...
test_a: 26 wallclock secs (25.80 usr + 0.00 sys = 25.80 CPU) @ 38.77/s (n=1000)
test_b: 15 wallclock secs (14.64 usr + 0.00 sys = 14.64 CPU) @ 68.31/s (n=1000)
test_c: 15 wallclock secs (14.53 usr + 0.00 sys = 14.53 CPU) @ 68.82/s (n=1000)
0420nobodyさん
2006/08/10(木) 10:51:06ID:???0421nobodyさん
2006/08/10(木) 11:00:41ID:???普通の for ループ(test_a)と、リストを渡す for ループ(test_c)では、明らかに 1.5 倍程度前者の方が遅い。
でも、foreach (test_b) と for (test_c) の違いは、「無い」と言っていい。
(上のを何度か実行してみたところ、全ての結果において test_c の方が 0.1 秒ほど速かったけど誤差の範囲)
0423nobodyさん
2006/08/10(木) 11:47:25ID:???そうじゃなくて、@aryを100とか1000くらいに、timetheseの方を100000とかにした方が現実的だと思っただけです。あんまり気にしないでください。
0424nobodyさん
2006/08/10(木) 11:48:22ID:???my @arr = (1 .. 10000);
timethese(1000, {
test_a => sub {
my $x = @arr;
for (my $i = 0; $i < $x ; $i++) { }
},
test_b => sub {
foreach (@arr) { }
},
test_c => sub {
my $n = 0;
for (@arr) { $n++; }
}
});
Benchmark: timing 1000 iterations of test_a, test_b, test_c...
test_a: 2 wallclock secs ( 1.88 usr + 0.00 sys = 1.88 CPU) @ 533.33/s (n=1000)
test_b: 1 wallclock secs ( 1.23 usr + 0.00 sys = 1.23 CPU) @ 810.37/s (n=1000)
test_c: 2 wallclock secs ( 1.86 usr + 0.00 sys = 1.86 CPU) @ 537.63/s (n=1000)
aで$n++する意味がわからん。
0426nobodyさん
2006/08/10(木) 12:01:22ID:???0427nobodyさん
2006/08/10(木) 12:27:47ID:???use Benchmark;
my @arr = (1 .. 1000);
timethese(10000, {
test_a => sub {
my $x = @arr;
for (my $i = 0; $i < $x ; $i++) { $arr[$i]=" "; }
},
test_b => sub {
foreach (@arr) { $_=" "; }
},
test_c => sub {
my $n = 0;
foreach (@arr) { $arr[$n++]=" "; }
},
test_d => sub {
my $n = 0;
foreach (@arr) { $arr[$n]=" ";$n++; }
}
});
__END__
Benchmark: timing 10000 iterations of test_a, test_b, test_c, test_d...
test_a: 4 wallclock secs ( 3.72 usr + 0.01 sys = 3.73 CPU) @ 2678.81/s (n=10000)
test_b: 2 wallclock secs ( 2.73 usr + 0.00 sys = 2.73 CPU) @ 3657.64/s (n=10000)
test_c: 4 wallclock secs ( 4.34 usr + 0.00 sys = 4.34 CPU) @ 2302.03/s (n=10000)
test_d: 4 wallclock secs ( 3.98 usr + 0.00 sys = 3.98 CPU) @ 2509.41/s (n=10000)
0428nobodyさん
2006/08/10(木) 13:47:00ID:???0429nobodyさん
2006/08/10(木) 16:36:09ID:???純粋に繰り返し部分だけを比較するなら @arr は余計。( $i は、それがないと
同等の機能を果たせないので必要)
for ( my $i=0; $i<10000; $i++) {}
for ( 0..10000-1 ) {}
0430nobodyさん
2006/08/10(木) 16:48:35ID:???timethese( 1000, {
a => sub { for ( my $i=0; $i<10000; $i++ ) {} },
b => sub { for ( 0..10000-1 ) {} }
});
---
a: 1 wallclock secs ( 1.49 usr + 0.00 sys = 1.49 CPU) @ 673.40/s (n=1000)
b: 1 wallclock secs ( 1.05 usr + 0.00 sys = 1.05 CPU) @ 955.11/s (n=1000)
前者は $i を使う分(?)少し遅くなってるが、実際の使用では
繰り返し処理のメイン処理部が時間を食うわけだから、どちらも同じ程度と
認識してよいでしょう。
0431nobodyさん
2006/08/10(木) 17:03:16ID:???for (@arr) {}
と
foreach (@arr) {}
を比べるんじゃないの?
内部では同じだから、ほとんど誤差分しか違いが出ないと思うけど。
条件付きの for (my $i = 0; $i < 1000; $i++) {} が
条件なしの foreach (0 .. 1000) より遅いのは仕方ないし。
0432nobodyさん
2006/08/10(木) 17:21:05ID:???0433nobodyさん
2006/08/10(木) 20:18:12ID:???0434
2006/08/10(木) 20:38:11ID:/HJpKD0Hforeach (@omomomo){
my $ha = $hoge[0];
my $hb = $hoge[1];
push(@a,$ha);
push(@a,$hb);
}
while(@ha && @hb){
my %has;
$has{hoge} = shift @ha;
$has{moge} = shift @hb;
push(@hogehoge,\%has);
}
$template->{hogehoge} = \@hogehoge;
これもっと短くする方法ないですかね
0435nobodyさん
2006/08/10(木) 20:48:18ID:???URLを指定してそれをダウンロードさせたいのですが、どのようなモジュールがありますでしょうか?
0436nobodyさん
2006/08/10(木) 20:48:39ID:???0437nobodyさん
2006/08/10(木) 20:48:41ID:???とか今は平気なんね。
知らなかったから参考になった。
>>434
templateしらんがforeachは何してるん。
0438nobodyさん
2006/08/10(木) 20:51:07ID:???file:///C:/Perl/html/site/lib/LWP/UserAgent.html
たぶんここに答えのファイルがあるはずだッ
0440nobodyさん
2006/08/10(木) 21:14:31ID:???スクリプト側でファイルのパーミッションを指定したり変更するにはどのような
方法がありますか?
0441nobodyさん
2006/08/10(木) 21:15:41ID:???0442nobodyさん
2006/08/10(木) 22:29:23ID:???#!/usr/bin/env perl
use LWP::Simple;
print "content-type:text/html\n\n";
getprint("http://www.yahoo.co.jp/");
0443434
2006/08/10(木) 22:30:27ID:???foreach(1..$num){ の間違いです(適当にかいてしまいました すみません
$numにはmysqlから取得した個数が入っていて
foreach(1..$num){
@hoge = $sql->fetchrow_array; # @hogeにはhogeとmogeを配列で値を取得
my $ha = $hoge[0];
my $hb = $hoge[1];
こんなかんじです
0444440
2006/08/10(木) 23:07:09ID:???各種ログファイル名 という項目でファイル名を指定するわけですが
その際にスクリプトの方でパーミッションを指定するにはどのように
記載すればよいですか?
0445435
2006/08/10(木) 23:13:13ID:???ありがとうございます。
Windows環境でないのですが、UserAgent.htmlを探してみたのですが
自分の環境にはないようです。
>>442
ありがとうございます
実際にやってみると、標準出力にソースが出力されてしまいます。
後付けで申し訳ないのですが、それをHTML::TagParserで処理したいのですが
そのような事が出来る方法などないでしょうか?
0447nobodyさん
2006/08/10(木) 23:27:11ID:???>>434
とりあえず短くした
while (my $row = $sql->fetchrow_arrayref) {
push @hogehoge, {hoge => $row->[0], moge => $row->[1]};
}
0448nobodyさん
2006/08/10(木) 23:28:38ID:???そのモジュール知らんけど、
>>$html = HTML::TagParser->new( "http://www.kawa.net/xp/index-j.html" );
ていうコードが引っかかって来たけど・・・?
0449nobodyさん
2006/08/10(木) 23:52:40ID:???出力結果を変数に入れてHTML::TagParserに渡すとか。
その方法すら想像付かないならプログラミング自体諦めたほうがよい。
0450444
2006/08/10(木) 23:54:01ID:???各種ログファイル名を指定する所で
$NAME_1 = 'logdata';
の用にした時のスクリプト側でパーミッションを指定する際には
どうしたらよいでしょうか?
簡単にperldoc -f chmod のままではうまくいきません。
0451nobodyさん
2006/08/11(金) 00:00:33ID:???chmod使ってどんな風に書いたの?
それでどううまく行かなかったの?
0453nobodyさん
2006/08/11(金) 00:06:50ID:???なんかソースにperldoc -f とか書いてそう・・・w
0454nobodyさん
2006/08/11(金) 00:09:08ID:???>>446 にも補ってもらってて、まだダメとは…。
コピペできるくらいに全部コード書いてあげないと分からないのでは。
0455444
2006/08/11(金) 00:19:47ID:???0456nobodyさん
2006/08/11(金) 00:34:46ID:???じゃあほれ
http://www.rfs.jp/sb/perl/05/chmod.html
455
0457nobodyさん
2006/08/11(金) 00:45:57ID:???だから perldoc は、その「書き方」を調べる為のコマンドだってば・・・。英語だけど中学レベルの簡単な英語。
Windows なら、スタート→プログラム→アクセサリ→コマンドプロンプトを開いて perldoc -f chmod と打ってEnter。
自分で調べられない奴は、いつまで経っても上達しない。どうせ perldoc で検索すらしてないんだろ。
0458nobodyさん
2006/08/11(金) 00:48:56ID:???0459nobodyさん
2006/08/11(金) 01:19:58ID:???0460nobodyさん
2006/08/11(金) 01:35:21ID:5JciSP0Nそのアンカの張り方いいなw
0461nobodyさん
2006/08/11(金) 01:43:15ID:???じゃあほれ
(p)http://www.rfs.jp/sb/perl/05/chmod.html
455
やるならちゃんと書いて欲しかったwww
■ このスレッドは過去ログ倉庫に格納されています