Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0558nobodyさん
2006/07/15(土) 19:19:39ID:???>#乱数の作成
>$rand1 = int(rand(10));
を
$rand1 = int(rand(10)) + 1;
と末尾に+1しろ。
0559nobodyさん
2006/07/15(土) 19:25:01ID:???1). 自力でつくってんだったら協力したるのに
2). 向うの掲示板に問い合わせろよ
3). KENT かよ!
0560nobodyさん
2006/07/15(土) 19:41:55ID:???だいたい合ってるwwwww
&code; とか気持ち悪いな。暗黙に &code(@_); と渡されることを知ってての諸行かな。
せめて &code(); とかにしてほしいなあ。
0561nobodyさん
2006/07/15(土) 19:48:58ID:???ありがとうございます。
文法的にも間違っていたようです。
>>559
すべてではないですが大半は作りましたが・・・・・。
0562nobodyさん
2006/07/15(土) 19:53:50ID:???全体の半分以上。過半。大部分。副詞的にも用いる。
へぇ・・・。
0563nobodyさん
2006/07/15(土) 19:55:13ID:???>せめて &code(); とかにしてほしいなあ。
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
と釣られてみるテスト
0564nobodyさん
2006/07/15(土) 20:04:58ID:???ほんとかどうか知らんが、おれは KENT であろうとなかろうと問い合わせ先が記入されてるソースに関してのレスは
つけんぞ。
おまえさんがさきに「この部分が自作です」といえば
話は別になるときもあるが。
0565nobodyさん
2006/07/15(土) 20:06:20ID:???0566nobodyさん
2006/07/15(土) 20:38:18ID:???ダメな子が増えて困る。
0567nobodyさん
2006/07/15(土) 20:45:33ID:???少なくともチャント動くし
0568nobodyさん
2006/07/15(土) 21:34:29ID:???○ 動きはする
0569nobodyさん
2006/07/15(土) 21:59:01ID:???0570nobodyさん
2006/07/15(土) 22:15:52ID:???0571nobodyさん
2006/07/15(土) 23:50:29ID:???攻撃できまくり☆(ゝω・)v
0572nobodyさん
2006/07/16(日) 00:07:06ID:???外部から任意コマンド実行可能なまま。
0573nobodyさん
2006/07/16(日) 06:07:21ID:???0574nobodyさん
2006/07/16(日) 13:59:39ID:pJTY6Rn5例えば
$hoge = '2743AB5837C9849';
というような文字列があるとして
$hoge =~ s/\D//g;
とした場合に\Dに該当する方(ABC)の値を取りたいんですが
どうすれば良いんでしょうか?
0575nobodyさん
2006/07/16(日) 14:07:23ID:???$&
0576574
2006/07/16(日) 14:21:08ID:pJTY6Rn5ありがとうございます。
マッチ変数というのがあるんですね。
ttp://www.rfs.jp/sb/perl/02/09.html
>後方参照の変数には上記のほかに、マッチ変数 $& $` $' $+ があります。これらの変数を使うと
>プログラム内のすべての正規表現の処理が遅くなるので、注意して使ってください。
という記述があったんですが、できることなら使わない方が良い代物なんでしょうか。
それとも多用がいけないのであって、1、2箇所であれば問題ないんでしょうか。
0578nobodyさん
2006/07/16(日) 14:48:17ID:???> という記述があったんですが、できることなら使わない方が良い代物なんでしょうか。
> それとも多用がいけないのであって、1、2箇所であれば問題ないんでしょうか。
1回でも使っている箇所があると、全ての正規表現が遅くなる。
マッチ変数が使われているかどうか調べるためのモジュールはDevel::SawAmpersand
0579nobodyさん
2006/07/16(日) 14:56:43ID:pJTY6Rn5ありがとうございます。
ちょっと落雷がヤバイので一旦PCの電源落とします。
落ち着いたらそのときまたレスします。すみません。
0580nobodyさん
2006/07/16(日) 15:07:17ID:???my @hit = () ;
push @hit, $1 while $hoge =~ s/(¥D)// ;
みたく $1 を使えば?
つーか $& 使ったことないなあ。オレ。
0581nobodyさん
2006/07/16(日) 15:54:56ID:???0582nobodyさん
2006/07/16(日) 16:08:19ID:???0583bench 魔
2006/07/16(日) 16:56:41ID:???===そーす===
my $str1 = 'a' x 6 . 'hoge' ;
$str1 = $str1 x 100 ;
sub test1(){ my ( $tmp, @hoge ) = $str1 ; push @hoge, $& while $tmp =~ s/hoge// ; }
sub test2(){ my ( $tmp, @hoge ) = $str1 ; push @hoge, $1 while $tmp =~ s/(hoge)// ; }
#timethese 10000, { test2 => 'test2' } ;
timethese 10000, { test1 => 'test1', test2 => 'test2' } ;
===実行結果===
1. ソース内に $& 蟻
Benchmark: timing 10000 iterations of test, test2...
test: 13 wallclock secs (13.22 usr + 0.10 sys = 13.32 CPU) @ 750.75/s (n=10000)
test2: 14 wallclock secs (13.34 usr + 0.10 sys = 13.44 CPU) @ 744.05/s (n=10000)
2. ソース内に $& なし(test1 をコメントアウト
Benchmark: timing 10000 iterations of test2...
test2: 14 wallclock secs (13.32 usr + 0.10 sys = 13.42 CPU) @ 745.16/s (n=10000)
0584bench 魔
2006/07/16(日) 16:57:32ID:???==========
で、test1 を以下の様に変えて
sub test1(){
my ( $tmp, @hoge, @fuga, @piyo ) = $str1 ;
( push (@hoge, $& ),
push (@fuga, $`),
push(@piyo, $' )) while $tmp =~ s/hoge// ; }
実行してみたが…
Benchmark: timing 10000 iterations of test, test2...
test: 26 wallclock secs (24.80 usr + 0.22 sys = 25.02 CPU) @ 399.68/s (n=10000)
test2: 14 wallclock secs (13.28 usr + 0.08 sys = 13.36 CPU) @ 748.50/s (n=10000)
test2 の結果は余りかわらず。
prelre にまで書いてある記載だから $& とか使ったら遅くなるケースが必ずある筈なんだけどなあ。
実際のソースで自分で確かめるしかねーな。
0585nobodyさん
2006/07/16(日) 17:10:42ID:???文句言いながらやる君が好きだ。
でも、
> これらの変数を使うとプログラム内のすべての正規表現の処理が遅くなるので、注意して使ってください
だから、同じ時に計測すると $1 の方も遅くなっちゃうんじゃないのかな?
比較じゃなくて構わないから、参考に単独での速度を計ってみてくれるといいかも。
できれば
> @hoges = $hoge =~ /\D/g;
系と
> push @hoges, $1 while $hoge =~ /(\D)/g ;
系とでも比較してあるとなお。
0586bench 魔
2006/07/16(日) 17:51:19ID:???>比較じゃなくて構わないから、参考に単独での速度を計ってみてくれるといいかも。
583 の 2.の条件が $& を排除した形のものデス。
$& の入っている行をすべてコメントアウトしました。
お約束「あなたの為にやるんじゃないんだからね!!」
>>583 のソースに
sub cont (){ my ( $tmp, @hoge ) = $str1 ; @hoge = $tmp =~ /hoge/g ;}
を加えて実行 ( 実行名 cont )。実行回数は 5 万回に変更
Benchmark: timing 50000 iterations of cont, test1, test2...
cont: 49 wallclock secs (48.24 usr + 0.34 sys = 48.58 CPU) @ 1029.23/s (n=50000)
test1: 67 wallclock secs (65.77 usr + 0.39 sys = 66.16 CPU) @ 755.74/s (n=50000)
test2: 69 wallclock secs (66.33 usr + 0.53 sys = 66.86 CPU) @ 747.83/s (n=50000)
そこから $& が入った部分を全削除して実行
Benchmark: timing 50000 iterations of cont, test2...
cont: 44 wallclock secs (42.59 usr + 0.33 sys = 42.92 CPU) @ 1164.96/s (n=50000)
test2: 69 wallclock secs (66.67 usr + 0.54 sys = 67.21 CPU) @ 743.94/s (n=50000)
…なるほど、test2 ( $1 を利用 )にはもともとコストが掛ってて $& の影響が表われなかった
だけか。
一箇所の正規表現だけだと、$1 より $& を使った方が速いがソース全体だと影響を及ぼす
という妥当な結果かな。
0587nobodyさん
2006/07/16(日) 18:23:45ID:???オツカレ!
つまり $& を使うとそもそも結果を伴う $1 の処理には影響ないけど、
普通の正規表現も結果をとることになるから総合的に遅くなる、ってわけだな。
結局、>>574の場合、一番早いのは
my @matchs = $hoge =~ /\D/g;
$hoge =~ s/\D//g; # ※より早い形→ $hoge =~ tr/0-9//cd;
って2段階で処理して $& も $1 も使わない形なんだろね。
0588574
2006/07/16(日) 19:11:43ID:pJTY6Rn5>>577
一度別の変数に逃がしておいて、そっちの方で再度逆のパターンで取得する、
という理解で良いんでしょうか。参考にしてみます。
括弧でくくって逃がしておく方法は知らなかったので勉強になりました。
>>578
マッチ変数は1箇所でも使うと他の全ての正規表現にも影響が出るんですね。
今のところ使ってる箇所はないんで、できたら使わない方向で考えてみます。
>>580>>581
速度も気になりますが、「注意して使ってください」の文言に
ちょっとビビってしまいました。でも、他にも正規表現使ってる箇所があるので
できたらマッチ変数使わなくても良いのならそっちの方が良いと思っています。
>>583-584>>586
画に描いたようなツンデレと詳しいベンチマークありがとうございました。
局所的にはマッチ変数よりも$1使った方が処理は速いけれど
他にも正規表現使ってる箇所があれば、結果は逆になるということですね。
コード内で他にもいくつか正規表現使ってるところがあるので
マッチ変数を使わなくてはならない状況になれば$1を代用することにします。
非常に勉強になりました。
>>587
正規表現の置換と言えば即sでやってたので
trに特有の便利な修飾子があるのを見落としていました。
ずばりの解答も含めてありがとうございました。
レスくださった皆さん、ありがとうございました。
最近あちこちで落雷が発生しているみたいなのでパソコンの方もご自愛下さい。
0589nobodyさん
2006/07/16(日) 19:42:51ID:???by KENT信者
0590nobodyさん
2006/07/16(日) 19:44:18ID:???0591nobodyさん
2006/07/16(日) 22:04:02ID:???たとえば ^\d$ と入力すると
0
1
2
3
4
5
6
7
8
9
と展開するみたいな
0592nobodyさん
2006/07/16(日) 22:16:57ID:???0593nobodyさん
2006/07/16(日) 22:32:38ID:???正規表現の展開?
0594591
2006/07/16(日) 22:41:09ID:???展開して表示する方法があるのかどうかです
^\d$なら>>591の通り0〜9まで展開
^[Aa]$ならAとaの2つ展開
という意味です
0595nobodyさん
2006/07/16(日) 22:52:27ID:???できないってことでいいよ。
0596nobodyさん
2006/07/16(日) 22:56:17ID:???0597nobodyさん
2006/07/16(日) 22:56:40ID:???>>592のいう通りじゃない?
簡単な正規表現だったら、頭の中で想像つくし、
複雑なものだったら、展開後の文字が何万行にも
わたってしまうから...
単純な例だと「/./」。
これの展開は 1byte で表されるものすべてだから、
多byte文字とか考えたらガクガクブルブルw
0599nobodyさん
2006/07/16(日) 23:01:02ID:???my @c = grep { $_ = chr($_); /$p/ } (0..0xFF);
0600nobodyさん
2006/07/16(日) 23:34:52ID:???そしてサーバ上にあらかじめ用意してあるファイルBにその結果を書き出す、
ということをやりたいんですが、そういうことは可能でしょうか?
0602600
2006/07/16(日) 23:42:33ID:???なるほど。とすると簡単な流れとしては
csvファイルAをサーバにアップロード
→オープンして処理
→ファイルBに書き込む
→ファイルA削除
という解釈で大丈夫でしょうか?
0603nobodyさん
2006/07/16(日) 23:48:10ID:???0607nobodyさん
2006/07/17(月) 00:25:28ID:???search.cpan.org にいって
NET::FTP とか NET::SSH::PERL とか
そっちがわ系のモジュールを検討してみたら?
0609600
2006/07/17(月) 00:46:22ID:???ファイルAをアップロード→オープン
のところで、おそらくアップロードが完了する前に
オープンをかけてしまいエラーが出てしまいます。
アップロードとファイルBへの書き込み処理は
別々にしないと無理ですかね・・・。
>>603
喜び勇んで早速書き始めてたらいきなり否定されてたとは・・・
>>605
grepを使うにしても、まずはサーバ上にファイルAを上げないとダメですよね?
>>606
そういうモジュールがあるんですか。
調べてみます。
0612nobodyさん
2006/07/17(月) 01:06:13ID:???0613nobodyさん
2006/07/17(月) 01:06:32ID:???パターンなんて無限大にあるしなあ。
/.../ これだけ展開するので 255*255*255 だろw
もっと条件言うか何がしたいか言うかしないと 「無理」 って感じ。
0615nobodyさん
NGNG観自在菩薩行深般若波羅蜜多時照見五
蘊皆空度一切苦厄舎利子色不異空空不
異色色即是空空即是色受想行識亦復如
是舎利子是諸法空相不生不滅不垢不浄
不増不減是故空中無色無受想行識無眼
耳鼻舌身意無色聲香味觸法無眼界乃至
無意識界無無明亦無無明尽乃至無老死
亦無老死尽無苦集滅道無智亦無得以無
所得故菩提薩垂依般若波羅蜜多故心無
罫礙無罫礙故無有恐怖遠離一切顛倒夢
想究竟涅槃三世諸仏依般若波羅蜜多故
得阿耨多羅三藐三菩提故知般若波羅蜜
多是大神咒是大明咒是無上咒是無等等
咒能除一切苦真実不虚故説般若波羅蜜
多咒即説咒曰
羯諦羯諦波羅羯諦波羅僧羯諦菩提薩婆訶
般若心経
仏説摩訶般若波羅蜜多心経観自在菩薩行深般若波羅蜜多時照見五蘊皆空度一
切苦厄舎利子色不異空空不異色色即是空空即是色受想行識亦復如是舎利子是
諸法空相不生不滅不垢不浄不増不減是故空中無色無受想行識無眼耳鼻舌身意
無色声香味触法無眼界乃至無意識界無無明亦無無明尽乃至無老死亦無老死尽
無苦集滅道無智亦無得以無所得故菩提薩捶依般若波羅蜜多故心無罫礙無罫礙
故無有恐怖遠離一切顛倒夢想究竟涅槃三世諸仏依般若波羅蜜多故得阿耨多羅
三貌三菩提故知般若波羅蜜多是大神呪是大明呪是無上呪是無等等呪能除一切
苦真実不虚故説般若波羅蜜多呪即説呪曰羯諦羯諦波羅羯諦波羅僧羯諦菩提薩
婆訶般若心経
0616607
2006/07/17(月) 01:10:00ID:???適当にぐぐっただけなので、中身は知らんよ。
ただ、ftp, ssh 系のモジュールは、cpan に結構ある
から、その中に役立つものはあるかも。
0617nobodyさん
2006/07/17(月) 01:11:22ID:???昔ム板のPerlスレで似たようなお題が出たのを思い出した。
Perlについての質問箱 21箱目
ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/478-
ミラー
ttp://makimo.to/2ch/pc8_tech/1134/1134327348.html#478
で、こんなのが紹介されている。
ttp://search.cpan.org/~bowmanbs/Regexp-Genex-0.06/lib/Regexp/Genex.pm
読んで試してみたらどうも\d等の文字クラスが含まれていると、
ランダムにしか出てこないみたいだけど参考まで。
0618600
2006/07/17(月) 01:21:32ID:???FTPと似たようなことができるみたいなので
よく分からない状態で用いるのは、
セキュリティ上危険な気がしました。
ご忠告ありがとうございました。
0619nobodyさん
2006/07/17(月) 05:25:24ID:AcPhLonl0620nobodyさん
2006/07/17(月) 06:08:57ID:???0621nobodyさん
2006/07/17(月) 07:11:29ID:???mod_perlでも動かすのかな?
それより、local宣言だらけを心配した方がいいよ。
逆に、my宣言が全然ないとか。
0623nobodyさん
2006/07/17(月) 11:23:26ID:???> FTPと似たようなことができるみたいなので
> よく分からない状態で用いるのは、
> セキュリティ上危険な気がしました。
「FTPと似たようなこと」をやろうとしてるんじゃなかったのか。
にほんごってむずかしーね。
0624nobodyさん
2006/07/17(月) 12:15:35ID:???いう事に思い至らなかっただけでしょ。
0626nobodyさん
2006/07/17(月) 16:03:52ID:???http?
0627nobodyさん
2006/07/17(月) 16:31:38ID:???1.8014398509482e+016
ってなるけど実数表示させるにはどうすりゃいいのん?
0631nobodyさん
2006/07/17(月) 17:13:50ID:???perldoc bigint を見れば分かるけど、
> "bigint" is just a thin wrapper around various modules of the Math::BigInt family.
0633nobodyさん
2006/07/17(月) 22:53:09ID:???0634nobodyさん
2006/07/17(月) 22:57:20ID:???消防はもう寝な
0638nobodyさん
2006/07/17(月) 23:21:32ID:???0640nobodyさん
2006/07/17(月) 23:43:04ID:???18014398509481984
こうですか? わかりません><
0641nobodyさん
2006/07/17(月) 23:45:16ID:???0642nobodyさん
2006/07/18(火) 00:11:32ID:???user@localhost:~$ perl -Mbigint -e 'print 64**9, "\n"'
18014398509481984
user@localhost:~$ perl -v | grep v5
This is perl, v5.8.8 built for i486-linux-gnu-thread-multi
0643nobodyさん
2006/07/18(火) 00:24:40ID:DXYFSpfLこのような表記は許されるのでしょうか?
1)$TEST[100]に代入されている文字列を表示させたい
2)$TEST[***]<-ここに$A[1]を入れたい
$A[1]=100;
$TEST[100]='TEST';
print $TEST[ $A[1] ];
やはり・・・
$A[1]=100;
$TEST[100]='TEST';
$B=$A[1];
print $TEST[$B];
なのかなあ
0645643
2006/07/18(火) 00:46:23ID:DXYFSpfLソース記述が途中で間違っていたのかも知れなかったです。
この表記がまちがっていると思い込んで2時間位悩んでいましたm(_ _)m
0646nobodyさん
2006/07/18(火) 00:52:26ID:???0647nobodyさん
2006/07/18(火) 01:00:06ID:???0648nobodyさん
2006/07/18(火) 02:34:41ID:???5.8.4 だけど、use bigint で 18014398509481984 って結果でたよ
>643
大文字は定数で使われるのがほとんどなので、変数は小文字でどぞ。
0649nobodyさん
2006/07/18(火) 03:41:25ID:???1.(2/3)*(2/3) の解を 4/9 にするにはどうすればいいですか?
2.次に1.の解を 1/2.25 (分子を1)にするにはどうすればよいですか?
0650nobodyさん
2006/07/18(火) 03:50:18ID:RAKThs0C$ENV{'HTTP_COOKIE'}で何も取得できません!
作成直後ではなくて、ブラウザでリクエストを再送しても取得できません。
どんな原因が考えられましょうか!
0651nobodyさん
2006/07/18(火) 04:54:13ID:???>>628と同様に、bigrat or Math::BigRatでどうよ。
2はライブラリ任せにしないで、算数的に出力時にdenominatorをnumeratorで割れば?
0652nobodyさん
2006/07/18(火) 05:24:58ID:???use bigrat;
$a = (2/3)*(7/57);
print $a,"\n";
printf( "1/%f",1/$a);
%fのところはうまくいじらないと思い通りの出力にならないかも?
つーか7/8を1/xと表示したいときxは何になってほしいのか・・・?
0653nobodyさん
2006/07/18(火) 05:35:52ID:???$ENV{'HTTP_COOKIE'}で何も取得できなくて、
いったい何で”保存されてるのを確認した”のか、教えてください。
パッと思いつく原因としてはクッキーを出してるスクリプト
と受け取ってるスクリプトがあるディレクトリが別になってるとか?
どうやってクッキーを発行して、どうやって受け取ろうとしてるのか、
もっと詳細に報告してください。
0654650
2006/07/18(火) 09:21:50ID:???スクリプトはいっしょで、読み書きするスクリプトをリロードして確認したり、
読みと書きでパラメータを分けて行き来したりしています。
Set-Cookie: session=test;expires=;\n
と書いてます。index.cgi?a=1で書いてindex.cgi?a=2で読んでいます。
宜しくお願いします!
0655nobodyさん
2006/07/18(火) 09:28:15ID:???現在作ってるスクリプトで設定内容などは
$config = {
'test' => "テスト"
}
sub get{
my $pkg = shift;
my $hash = $config;
bless $config, $pkg;
}
my($cfg) = config->get();
print $cfg->{test};
この用にして設定内容を取得してます。
そして今回、$config の中に配列へのリファレンスを含めるようになり
@urls = (ずらずら〜っと);
と URL が書かれた配列へのリファレンスを
$config = {
'urls' => \@urls,
}
として $config へ設定しました。
この際に $cfg で値を取得する書き方としては
@{$cfg->{'urls'}}
で正解なのでしょうか?
もっときれいな書き方や 「こっちのほうが解釈としては正解じゃね?」 みたいな
書き方があれば教えていただければ幸いです。
0657nobodyさん
2006/07/18(火) 10:19:23ID:???■ このスレッドは過去ログ倉庫に格納されています