Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0522519
2006/07/13(木) 22:24:37ID:Ms2xB21u要は私の場合は戻るボタンが効かないように、ではなくて、
アクセス解析CGIがちゃんと動作することと、
チャットで使ってる、
<meta http-equiv="Refresh" content="15">
がちゃんと動作することなのですが。
0523519
2006/07/13(木) 22:25:35ID:Ms2xB21uありがとうございます。
その書き方がイマイチ自身がもてなかったので投稿して確認に参りました。
0524nobodyさん
2006/07/13(木) 22:26:24ID:???0525nobodyさん
2006/07/13(木) 23:13:19ID:???というエラーが出たんですが、これはどういうときに出るもんなんですか?
test.cgiの60行目で''と''が同じになってるよ(コピーされたとかじゃなくてな)
ってこと?意味が分かりません。
0526525
2006/07/13(木) 23:16:07ID:???59行目}elsif($action eq 'move'){
60行目&move;
61行目&move_complete;
62行目}elsif(......
0529nobodyさん
2006/07/14(金) 00:05:57ID:???この「temp」フォルダの中にある各フォルダの名前を$dirnameとしましょう。
各フォルダの中に、
{
$dirname
}
とだけ書かれた、「test.txt」という名前のファイルをそれぞれ新しく作りたいんです。
#!/usr/bin/perl
opendir DIR, "temp" or die "can't open temp\n";
@dir = map { -d "temp/$_" ? $_ : '' } readdir DIR;
foreach $dirname (@dir) {
chdir "./$dirname";
open OUT, ">test.txt" or die "can't create the file\n";
print OUT "{\n";
print OUT "$dirname\n";
print OUT "}\n";
close OUT;
chdir "..";
}
close DIR;
こんな感じにプログラムを書いてDOSプロンプトから実行したのですが何も起きません・・・
どうすればいいのか教えていただけないでしょうか?
0530525
2006/07/14(金) 00:20:17ID:???&move;を別の名前に変える動いた・・・なぜ??
逆に59行目の'move'を別の名前に変えただけでは同じエラーが。
0531nobodyさん
2006/07/14(金) 00:26:19ID:???とりあえず、mapで書いてる行をgrepで書き直す。
@dir = grep { -d "temp/$_" && !/^¥./ } readdir(DIR);
0533nobodyさん
2006/07/14(金) 01:07:41ID:???print @dir ; か
chdir "./$dirname" or die してみそ
@dir の中身は
./temp/hoge
./temp/piyo
じゃなく
hoge
piyo
になるYO @OSX
0534nobodyさん
2006/07/14(金) 01:11:29ID:???foreachの前の時点で@dirに期待した値が入ってるかどうかぐらいは
確認して問題の切り分けをしろよ。
あとchdirも失敗することがあるので or dieしとけ。
0535nobodyさん
2006/07/14(金) 01:13:56ID:???誰かがなんか書いたらそれコピペして動くかどうかだけ?
なんだかなぁ。
0536nobodyさん
2006/07/14(金) 01:14:40ID:???open OUT, "> temp/$dirname/test.txt" or die "can't create the file\n";
ってすればいいじゃない
0537nobodyさん
2006/07/14(金) 01:21:07ID:???0538529
2006/07/14(金) 01:27:17ID:???できました!!!
ものすごく賢いやり方ですね。
>>534、>>533
chdirがうまくいってなかったというか、どうやら相対ディレクトリ名の指定とかが根本的
にわかっていなかったようです。openでカレントディレクトリも変わるんだと思ってました。
>>535
(・∀・)
みなさんどうもありがとうございます。
おかげさまで相対ディレクトリ名の指定ということに関してだいぶ理解が進みました。
0539nobodyさん
2006/07/14(金) 02:04:03ID:???そもそも1回目の
chdir "./$dirname";
でもし成功して temp/hoge/ になっちゃった場合、2回目はそこから chdir だから temp/hoge/fuga/ とかなんじゃねの?
0540nobodyさん
2006/07/14(金) 02:23:45ID:???フルパスも相対パスも知らずにファイル扱ってたのか((( ;゚Д゚)))
0541nobodyさん
2006/07/14(金) 02:33:40ID:???>>529 のコードではファイルへの書き込みを行なった後に chdir ".." してるから
temp/ → temp/hoge/ → temp/ と戻るはず。
でもやっぱり読みづらいから、カレントディレクトリはあんまり変えて欲しくないなぁ。
0542nobodyさん
2006/07/14(金) 16:30:45ID:???前提条件でそういうのはないならOKだが一般的にはchdir ".."では
戻れないかもしれない。
perlのchdirにはファイルハンドルやディレクトリハンドルを渡せるので、
戻りたいディレクトリを開いておいてこっちを使うほうが安全。
0543nobodyさん
2006/07/14(金) 18:02:15ID:IyAZlhFkqmailなのですが、perlにパイプさせるにはどうしたらよいでしょうか?
sendmailなら/etc/aliases でできますよね?
0545nobodyさん
2006/07/14(金) 19:43:53ID:???上記の掲示板に投稿する際のコード入力のスクリプトを作ったんですが
時たまコード入力より下が表示されなくなってしまいます。
どうすれば改善していいか分かりません。
どなたか改善よろしくお願いします。
0546nobodyさん
2006/07/14(金) 19:50:38ID:???<form>タグが無い。
<table>タグも無い。
下から5行目、==&gt;と書くべき所で、'==>' と書いている。
0547nobodyさん
2006/07/14(金) 19:55:39ID:???というか、sub code 自体をどこからも呼んでない…。
sub error は存在しない。
何がしたいの?そこからして不明。
0548nobodyさん
2006/07/14(金) 19:59:34ID:???削除パスワードの下に&code;で呼び出して使ってます。
sub errorはあります。
で何をしたいかと言うとどうやってもコード部分が原因だと分かっていてもたまにコード部分からしたが消える
のが直せないので直してほしいわけです。
0549nobodyさん
2006/07/14(金) 20:04:26ID:???0550nobodyさん
2006/07/14(金) 20:05:56ID:???そんな一部しかないんじゃ分からん…。
とりあえず、>>546 の通り&code の中でHTML表示してる部分、
tableタグの開始も終了も無いんだが…。そこが一番あやしい。
ちゃんとtableタグ入れてみたら?
それさえ分からなければ、PerlじゃなくてHTMLの質問だよ。
0551nobodyさん
2006/07/14(金) 20:08:03ID:???http://livetool.ty.land.to/aska/aska.cgi
ココに問題の掲示板とソースをのっけてあります。
数回更新ボタンを押していると表示されなくなりますのでそれを改善したいのです。
よろしくお願いします。
0552nobodyさん
2006/07/14(金) 22:04:47ID:LnOAoBN3よい参考書を教えてください
0554nobodyさん
2006/07/14(金) 22:26:32ID:cNzjTfEoその程度は参考書などいらない。
というか基本的にプログラム組むのに参考書なんていらない。
http://www.rfs.jp/sb/index.html
ここに書いてある内容を全て理解・・しなくても簡単にそのくらいは作れる。
まずは自分のパソコンに仮想環境を作ることが先決だ。
そうすればどれだけ程度の低い話なのかわかる。
優れたプログラムを組めるかどうかは人によって優劣がでるが、
最低限動くものなら健常者であれば誰でも可能。
0555nobodyさん
2006/07/14(金) 23:28:12ID:???WebProgは脆弱性があると、攻撃される危険が付きまとうことも忘れないでくれ。
と言うことで最低限ここは読んでおくべき。
ttp://www.ipa.go.jp/security/awareness/vendor/programming/
出来ればこの辺もね
ttp://www.jumperz.net/texts/csrf.htm
0556nobodyさん
2006/07/15(土) 13:04:39ID:FLr1xmaF0558nobodyさん
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:???■ このスレッドは過去ログ倉庫に格納されています