Perlコーディング初心者質問スレ Part 51
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/07/27(木) 17:04:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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
0462nobodyさん
2006/08/11(金) 15:50:22ID:???モジュールをコンパイルしてインストールしたら
/usr/pkg/lib/perl5/site_perl/5.8.0/HTML/TagParser.pm
としてインストールされました。
この場合、そこをuseしたらいいのでしょうか?
use HTML::TagParser /usr/pkg;
では、Internal Serverr Errorになりました。
0463nobodyさん
2006/08/11(金) 16:06:40ID:???使い方は、perldoc HTML::TagParser 参照
0464nobodyさん
2006/08/11(金) 16:15:09ID:???それでもInternal Server Errorになります。
コードはサンプルコードの
my $html = HTML::TagParser->new( '<html><form action="hoge.cgi"></form></html>' );
my $elem = $html->getElementsByTagName( "form" );
print "<form action=\"", $elem->getAttribute("action"), "\">\n" if ref $elem;
と記述しているだけなので、間違いはないと思います。
0465nobodyさん
2006/08/11(金) 16:17:37ID:???use が失敗してるなら、@INC調べる
0466nobodyさん
2006/08/11(金) 16:49:30ID:???あと、その設定が保存されてるファイルってどれですか
0467nobodyさん
2006/08/11(金) 21:27:36ID:oxtjr5tX置き換えによる部分削除をしたいのですが
すべての文字列を対象とする場合はたとえば
s/<dl> </dl>//;
とした場合、このタグの間にどのようなメタキャラクタを
書けばよいのでしょうか?
0468nobodyさん
2006/08/11(金) 21:51:09ID:???わからん!
0469nobodyさん
2006/08/11(金) 22:02:39ID:???つ【http://www.google.co.jp/search?q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE】
0470nobodyさん
2006/08/11(金) 22:27:28ID:oxtjr5tXうまく活きました。
ありがとうございます。
<dl>([^\<]*)</dl>までは思いついたのですが
これではダメだったんですよ。
あなたに幸あれ。
0471nobodyさん
2006/08/11(金) 22:28:45ID:???ttp://user.ftth100.com/mirrorhenkan/perl/search.php?word=Internal+Server+Error
Internal Server Errorはよく出るよなー。
うんうん。
>>1読み直して来い。
0472nobodyさん
2006/08/11(金) 23:34:34ID:???0473nobodyさん
2006/08/12(土) 01:55:00ID:???考えております。以下によりサイズ取得は成功しているようなのですが
(エラーメッセージが出ない為)取得したファイルサイズを変数に格納
する事は出来ないのでしょうか?
$ftp->size($testfile) || print "サイズ取得失敗";
どなたか宜しくお願い致します。
0474nobodyさん
2006/08/12(土) 02:17:54ID:???0475nobodyさん
2006/08/12(土) 02:56:22ID:???釣りとしか思えない。
0476nobodyさん
2006/08/12(土) 06:21:24ID:???0477nobodyさん
2006/08/12(土) 06:22:39ID:???0478nobodyさん
2006/08/12(土) 15:50:42ID:???0480nobodyさん
2006/08/12(土) 16:34:26ID:???0482nobodyさん
2006/08/12(土) 22:08:26ID:???>Net::FTPを知ってて代入を知らないなんて。
すいません。本当にわからないのです。
取得したサイズを変数に代入するにはどうしたらよいのでしょうか?
0483nobodyさん
2006/08/12(土) 22:25:59ID:???0484nobodyさん
2006/08/12(土) 22:30:29ID:???0486nobodyさん
2006/08/12(土) 22:36:10ID:???右辺です。
0487nobodyさん
2006/08/12(土) 22:47:26ID:???0488nobodyさん
2006/08/13(日) 00:42:28ID:BxCEpRljそこで無名配列にハッシュのリファレンスを順番にpushしたいのですが上手くいきません。
なんででしょうか。
use strict;
use MLDBM qw(DB_File);
use Fcntl;
tie(my %save, "MLDBM", "data.db", O_CREAT|O_RDWR, 0644) or die "エラー";
push @{$save{$aaa}}, $hash;
untie %save;
0490nobodyさん
2006/08/13(日) 02:45:17ID:???0491nobodyさん
2006/08/13(日) 22:31:10ID:???0492nobodyさん
2006/08/13(日) 22:48:17ID:???0493nobodyさん
2006/08/13(日) 23:43:12ID:???0494nobodyさん
2006/08/14(月) 00:24:45ID:???0495nobodyさん
2006/08/14(月) 16:23:58ID:???$size = $ftp->size($testfile) || print "サイズ取得失敗";
つまり、優先順位がわからなかったかったものと思われる。
>>473は、次のうち好きなのを選んでね。
$size = $ftp->size($testfile);
$size || print "サイズ取得失敗";
($size = $ftp->size($testfile)) || print "サイズ取得失敗";
$size = $ftp->size($testfile) or print "サイズ取得失敗";
エスパーからの回答でした。
0497nobodyさん
2006/08/15(火) 11:24:02ID:???結構気づきにくいところだね。
0498nobodyさん
2006/08/15(火) 15:09:13ID:amgg11pzヒアドキュメント内で関数は使えないのでしょうか?
$a = 1;
print <<DOC;
元の値:$a
処理後の値:&hoge($a)
DOC
sub hoge{
my $tmp = shift
$tmp++;
return $tmp;
}
0500nobodyさん
2006/08/15(火) 16:44:41ID:???l''''レ :l|゙'rレ,,゙'r, .,,,,,,,
l .l ゙'!,,゙レヘ!" :| |
l .l___,,~ | :| .,,,
'l~~~~~~ ̄ .,,,,,_,,,, .| │ :|,,irrr‐'''''"~.゙'!i、
 ̄ ̄ ゙̄,l リ: : .| :| ィー'''''' ̄` .,,,,,ir-ー''''}" ,r"
'|'| .,,,, l|,,,,―i、 ,,,,,,i、,,,、 .,ri、 'l'ト │ ,l゙ | | =--'''''"| | ,i" ,r"
.l | ._,,, | l '{\ _,,二,、 ,rlレ''l''l'''!i,'i、 l゙,| ,-rr,|.|,,,,,i、 .,l゙ .,l゙ .| .| | :| ,i" ,i"
.,,l`|,|レr" .|.| .'Lト .'l|レー'''=゙L .,l゙,i´ l゙,! .リ゙l |.| .゙~ ̄|:| .,,i´ ,/ | l゙ | | .~'〃
: ,i'レ'~ .|.| ,r, ゙l,,} .,"| l..l、,ト,i´ .,!,レ | | ,,r-ノ.|,、 .,,i'" ,r" : ..,,i´.レ l゙ │
: リリ----r, ゙l,,l,,,i" ,,,,r!二 ゙l,,,,レ゙ ,r',,レ" l゙.| .l|'ニ,l゙,!!ii,= .,〃 ,,r" .゙l~゙゙゙゛.,,/ リ, .゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙レ
.~゙゙゙゙゙゙゙゙゙゙" `` ゙='''" `~` `゙゛ `"'''~ ゙'!'" "'''''''~゛ ゙~''''''''''''''''''''''''"
0502nobodyさん
2006/08/15(火) 19:34:41ID:???確認しました。出来るんですね。
でも、邪道なのか・・・。
大量に変数あるんで、いつも困ってたんだが、
おとなしく普通にするかな。
配列にして、ループで処理か。
printf <<"DOC", $a, &hoge($a);
元の値:%d
処理後の値:%d
DOC
みたいな?
0504nobodyさん
2006/08/15(火) 19:56:22ID:???"処理後の値: &hoge()";
or
"処理後の値: {hoge()}";
でちゃんと展開されるよ。
0505nobodyさん
2006/08/15(火) 21:03:52ID:???tableの行をforeach文で増やしたい場合は、どのようにするのが適切でしょうか?
・
・
foreach (@abc){
$q->Tr(
$q->td($q->b("xxx")),
$q->td($q->b("yyy"))
)
}
・
・
のようなカタチでやってみると、うまく表示が出ません。
この描き方は間違っているのでしょうか?
ご教授お願いします。
0507505
2006/08/15(火) 21:59:06ID:???レスありがとうございます。
print は一番初めにかいて、
print $q->start_html,
$q->start_table,
foreach (@abc){
$q->Tr(
$q->td($q->b("xxx")),
$q->td($q->b("yyy"))
)
}
$q->end_table,
$q->end_html;
の用に利用していました。
ここで、foreach文を使うときは、foreach文のブロック部分と、それ以外の部分のところでつかうprintを分けてみたらできました。
506さんのレスで気がつくことができました。
ありがとうございます。
0508nobodyさん
2006/08/15(火) 22:15:10ID:OtEfXNbtmy $sca = join '',@arr;
どうしてもこんな処理をしたいんですけど、
もっとスマートに書く方法はありますか?
以前は
foreach my $line(<FH>){
chomp;
$sca = $line;
}
としてたんですが、
うまい方法をご教授願います
0509508
2006/08/15(火) 22:17:00ID:OtEfXNbt× $sca = $line;
〇 $sca .= $line;
0510nobodyさん
2006/08/15(火) 22:25:47ID:???my $sca = do {local $/; <FH>};
これはどう?
0511508
2006/08/15(火) 22:47:02ID:OtEfXNbtdoは使った事がないので、今はあまり理解できてませんが参考になりました。
ありがとうございます。
0512nobodyさん
2006/08/16(水) 00:10:37ID:???これじゃなにか不具合でも?
■ このスレッドは過去ログ倉庫に格納されています