1 名前:(・∀・)チンポー!! mailto:(・∀・)チンポー!! [04/06/02 11:39] perl書きなんだがさ、こうリクに答えてなんか作りたいんだ。 だからリクエストをくれ。
552 名前:デフォルトの名無しさん mailto:sage [2006/04/02(日) 06:41:56 ] # IPアドレス→32bit整数 $ip = unpack('N', pack('CCCC', split(/\./, $ip))); これで2倍くらいの速度になった キャプチャが大きいんかなぁ 2個目のIPアドレス変換部分、最後が\d+じゃなくて\dになってたよ。 桁数が多いから計算ミスかと思ったけど、数字が文字列として尻についてただけなんだね。
553 名前:デフォルトの名無しさん mailto:sage [2006/04/04(火) 17:06:58 ] >>552 use Socket; して inet_aton() 使ったら?
554 名前:デフォルトの名無しさん mailto:sage [2006/04/05(水) 11:25:50 ] ベンチしたらinet_aton意外にとてつもなく遅いです。あとは ・「.」でばらすのはsplitより正規表現でキャプチャする方が速い ・4つの10進数から32bit整数にするのは、シフト>掛け算>pack-unpackの順で速い。 552の言うのとは逆の結果になったわけだがなんでかね? Benchmark: running inet_aton, multiple_re, shift_re, unpack_re, unpack_split for at least 3 CPU seconds... inet_aton: 5 wallclock secs ( 1.62 usr + 1.46 sys = 3.08 CPU) @ 425.97/s (n=1312) multiple_re: 7 wallclock secs ( 3.26 usr + 0.00 sys = 3.26 CPU) @ 229803.99/s (n=749161) shift_re: 3 wallclock secs ( 3.08 usr + 0.03 sys = 3.11 CPU) @ 274049.84/s (n=852295) unpack_re: 3 wallclock secs ( 3.10 usr + 0.00 sys = 3.10 CPU) @ 183073.87/s (n=567529) unpack_split: 4 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 119672.52/s (n=374575)
555 名前:デフォルトの名無しさん mailto:sage [2006/04/05(水) 11:26:39 ] use Benchmark; use Socket qw(inet_aton); my $ip_a = 100.100.100.100; timethese(undef, { unpack_split => sub { my $ip = unpack('N', pack('CCCC', split(/\./, $ip_a))); }, unpack_re => sub { $ip_a =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; my $ip = unpack('N', pack('CCCC', $1, $2, $3, $4)); }, multiple_re => sub { $ip_a =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; my $ip = $1*256*256*256 + $2*256*256 + $3*256 + $4; }, shift_re => sub { $ip_a =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; my $ip = $1 << 24 + $2 << 16 + $3 << 8 + $4; }, inet_aton => sub { my $ip = inet_aton($ip_a); }, } );
556 名前:デフォルトの名無しさん mailto:sage [2006/04/05(水) 12:29:42 ] すまん、どうにも直観と反する結果なのでさらに調べていたらなんのことはない my $ip_a = 100.100.100.100; になっていたorz... もちろん正しくは my $ip_a = '100.100.100.100'; なのでベンチ取り直した。 Benchmark: running inet_aton, multiple_re, shift_re, unpack_re, unpack_split for at least 3 CPU seconds... inet_aton: 3 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 267949.37/s (n=846720) multiple_re: 3 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 69144.94/s (n=218498) shift_re: 4 wallclock secs ( 3.11 usr + 0.00 sys = 3.11 CPU) @ 74248.87/s (n=230914) unpack_re: 3 wallclock secs ( 3.21 usr + 0.00 sys = 3.21 CPU) @ 68071.03/s (n=218508) unpack_split: 2 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 95474.76/s (n=298836) まとめ: inet_atonはやっぱり速いので、自分で書くのはやめよう。
557 名前:デフォルトの名無しさん mailto:sage [2006/04/05(水) 13:42:14 ] v文字列以外では ・ inet_atonはpackしたIPアドレス("100.100.100.100"なら"dddd")を返すのに、他は整数(1684300900)を算出している。 ・ "+"演算子は"<<"演算子より優先度が高いため($1 << 24)とカッコで括らなければならない。 一応 sub getRandIPString { join '.', int rand 256, int rand 256, int rand 256, int rand 256; } といったものを用意して 全てバイナリ文字列を出力するコードにしてからベンチ取ったけど、inet_atonが常に1位だった。 今更だけど、後で直接比較可能にするための前処理として保存しとけば速度関係無かったね。
558 名前:デフォルトの名無しさん mailto:sage [2006/04/19(水) 06:59:49 ] Mac OS XでPerlを使っています。 Macで作成したテキストを処理したいのですが、改行コードがCRになるのでうまく処理できません。 LFでないため、全て1行として認識されてしまいます。 標準入力を常にLFとして読み込んだ後、それに対してマッチや置換を行いたいのです。 以下のように書いてみましたけどダメでした。 while (<>) { s/\x0D\x0A|\x0D|\x0A/\x0A/g; if (/aaa/) { print; } } 出力されたデータはLFになりましたが、マッチはうまくいきませんでした。 何かいいやり方はないものでしょうか。
559 名前:デフォルトの名無しさん mailto:sage [2006/04/19(水) 09:14:57 ] 求めてるのは<>使う前の $/ = "\x0D"; か /aaa/m あたりかも
560 名前:558 mailto:sage [2006/04/19(水) 19:51:43 ] >559さん 入力時の区切り文字をCRに決めてやればいいんですね。 解決しました。ありがとうございました。
561 名前:デフォルトの名無しさん mailto:sage [2006/04/19(水) 23:24:22 ] すいません。行のナンバリングをリクエストしてもよろしいでしょうか。 あいうえお(段落1) かきくけこ(段落2) さしすせそ(段落3) たちつてと(段落4) なにぬねの(段落5) はひふへほ(段落6) という文章があって、これを、 1:あいうえお(段落1) 2:かきくけこ(段落2) 3:さしすせそ(段落3) 1:たちつてと(段落4) 2:なにぬねの(段落5) 3:はひふへほ(段落6) のように空行をはさんで新たにナンバリングを開始したいのですが方法が思い浮かびません。
562 名前:デフォルトの名無しさん mailto:sage [2006/04/19(水) 23:59:01 ] 言いたいことが分からんが新たにナンバリングを開始したいところで ナンバリング用の変数を初期化して空行を出力するだけじゃないのか?
563 名前:デフォルトの名無しさん mailto:sage [2006/04/20(木) 02:27:54 ] >>561 は、単純にすべての行に通し番号でナンバリングするプログラムは作れるのか?
564 名前:561 mailto:sage [2006/04/20(木) 23:04:01 ] >563 あっ、はい。 my $i = 0; while (<STDIN>) { if (/^./) { print ++$i; print ": "; print; } } ちょっと冗長ですけど。
565 名前:デフォルトの名無しさん mailto:sage [2006/04/21(金) 00:11:57 ] うーん、、、自分で作りたい?それとも誰かにサクッと作って欲しい?
566 名前:デフォルトの名無しさん mailto:sage [2006/04/21(金) 10:46:46 ] >>564 そこまでかけるなら else で $i = 0; を書けないか?
567 名前:デフォルトの名無しさん mailto:sage [2006/04/21(金) 10:55:29 ] 空行が来たらカウントをリセットする、というと、こんな感じ? $n = 1; while (<>) { $n = 1 if (/^\s*$/ print "$n: $_"; $n++; }
568 名前:デフォルトの名無しさん mailto:sage [2006/04/21(金) 10:58:13 ] あ、閉括弧とか忘れた。まあいいや。脳内で修正してくれ。
569 名前:561 mailto:sage [2006/04/21(金) 22:35:44 ] >566 elseを使っても結果が変わらないんです。 マッチがヘボいんでしょうか。 >567 実行させると入力がぶっとんでしまいました… >565 いろいろ試してみたのですが、自分の力ではムリっぽいです… あつかましいとは承知していますが、作っていただくと助かります。
570 名前:561 mailto:sage [2006/04/22(土) 19:48:05 ] 出来てしまいました! my $i = 0; while (<STDIN>) { if (/^..+/) { print ++$i; print ": "; print; } else { $i = 0; print; } } else文で「my $i = 0;」にしていたのがまずかったようで、 空行になっても$iが初期化されなかったみたいです。 レス下さったみなさん、ありがとうございました。 おさわがせしました。 私ってPerlの才能ないのかな…
571 名前:デフォルトの名無しさん mailto:sage [2006/04/23(日) 05:53:25 ] >>570 完成おめ! 才能がどうかは知らないけど、結局経験じゃないですかね? 俺も本スレで叩かれたりしながら勉強してますw 一応俺が用意してたスクリプト貼っておきます。。。 use strict; my $c = 1; open IN, 'filename'; while (<IN>) { (/^$/) ? $c = 1 : print $c++ . ':'; print; } close IN;
572 名前:561 mailto:sage [2006/04/23(日) 12:42:55 ] >571 ありがとうございます。 自分のはだいぶ冗長だと思うので、用意していただいたスクリプトを参考にさせていただきます。 今自分の書いたものを見直してみると、if (/^./)でいいですよね... 恥ずかしい...
573 名前:デフォルトの名無しさん mailto:sage [2006/04/23(日) 14:49:38 ] >>570 myはローカル変数の宣言。単なる代入では無いよ。 myを使うと、同名の新たな一時変数を作る事になる。 んで、詳しい条件は忘れたが、ブロック抜ける時とかに消える。 長いコードになると 「この変数名って他で使われて無かったっけ…?」 ってなるけど、my使えばそんな心配が減るワケ。
574 名前:デフォルトの名無しさん mailto:sage [2006/04/23(日) 18:39:57 ] >>558 >>560 では解決しちゃったみたいだけど、これ俺も知りたい。 コマンドラインから入力されたテキストの改行コードをLFに統一、 という前処理をしてからwhileループ処理をかますってできるのかな? あんまりセパレータとか変えたくないんで。
575 名前:デフォルトの名無しさん mailto:sage [2006/04/23(日) 21:25:04 ] >>574 >セパレータとか変えたくない なんで?
576 名前:デフォルトの名無しさん mailto:sage [2006/04/23(日) 22:10:27 ] >575 セパレータも一文字として認識されてしまわない? 回避する方法があればいいんだけど。
577 名前:デフォルトの名無しさん mailto:sage [2006/04/23(日) 23:08:11 ] 認識できるから区切れるんだが。 いまいち言いたいことが分からん。
578 名前:デフォルトの名無しさん mailto:sage [2006/04/23(日) 23:40:26 ] メタキャラ「.」って改行を除く一文字にマッチするじゃん。 でも「.」もCRにマッチしちゃわね? LF読み込むときと処理が変わっちゃうからイライラすんだよね。
579 名前:デフォルトの名無しさん mailto:sage [2006/04/24(月) 00:10:50 ] 自分の都合に合わせてセパレーター変えるなり置換するなりすりゃいいじゃん。
580 名前:デフォルトの名無しさん mailto:sage [2006/04/24(月) 03:57:29 ] あーいう変数ってlocal出来ないっけ?
581 名前:デフォルトの名無しさん mailto:sage [2006/04/24(月) 23:15:36 ] whileで読み込む前に処理しとくって、 できないってことでおk?
582 名前:デフォルトの名無しさん mailto:sage [2006/04/25(火) 04:35:21 ] 質問は質問スレ行け
583 名前:デフォルトの名無しさん mailto:sage [2006/05/01(月) 22:52:12 ] Win32::GUI::ListView ソートメソッドないじゃん・・・orz た・・・す・・・け・・・て・・・・
584 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 22:54:05 ] りすとびゅーか... なにもかもがな・・つ・・か・・し・・ぃ・・
585 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 20:37:02 ] 一瞬、不治痛の電子帳票ソフトかと思った
586 名前:デフォルトの名無しさん [2006/07/09(日) 11:10:16 ] 初めまして。 浅知恵で掲示板の改造を試みています。 オートリンク機能付き掲示板に記事修正機能を追加したのですが、 記事修正をするたびに、文中にあるリンク先が <A href=www.a.b.c target=_blank><A HREF=www.a.b.c target=_blank> www.a.b.c</A></A> と、タグが無制限に追加されていきます。 そこでお願いしたいのは、 記事修正時にファイルに保存されているデータ ---------------------------------------------- <A HREF=www.a.b.c target=_blank> www.a.b.c</A> ---------------------------------------------- を一端 ---------------------------------------------- www.a.b.c ---------------------------------------------- というデータに戻すサブルーチンを作成したいのですが、 行き詰まっています。 よろしくお願いします。 オートリンク機能のスクリプトは以下の通りです。 *************************************************************** #オートリンク sub auto_link { my($msg) = $_[0]; $msg =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<A HREF=$2 target=_blank>$2<\/A>/g; return $msg; }
587 名前:デフォルトの名無しさん mailto:sage [2006/07/09(日) 11:15:33 ] ↑ ありゃ、文字がおかしい。 全角にしてありますが、Aタグです。 www.a.b.c の後ろは、</A>
588 名前:デフォルトの名無しさん mailto:sage [2006/07/10(月) 01:11:44 ] そういう時は表示時にオートリンクを適用すればいい。 保存時にいじっちゃうと後でいじりにくくなるというのは定説。 ファイル構造上、改行の置換とかは仕方無いと思うけどさ。
589 名前:デフォルトの名無しさん mailto:sage [2006/07/10(月) 10:01:41 ] >>586 ようするに、すでに<A>タグ化されている部分を除外すればいいわけだな?
590 名前:デフォルトの名無しさん [2006/07/10(月) 10:03:49 ] ああ、ごめん。>>586 にいての>>588 の意見を読んでなかった。 確かに保存時は生データのまま記録し置いて、閲覧時に http:なんた
591 名前:デフォルトの名無しさん mailto:sage [2006/07/10(月) 10:06:04 ] >>590 途中で送信しちゃった。 保存時は生で。閲覧時は「http:なんたら」の条件で抽出→<A>タグ化のほうが効率的だね。
592 名前:586 mailto:sage [2006/07/10(月) 14:07:06 ] みなさん、ありがとうございました。 発想の転換ですね。 私の堅い頭では思いつきませんでした。 保存時ではなく、表示時にオートリンクを適用でうまくいきました。 ありがとうございました。
593 名前:デフォルトの名無しさん mailto:sage [2006/07/18(火) 22:59:04 ] 俺は全く解らないので、申し訳ないけど誰かに頼みたいorz ボタンを押したらカウントが増えるシンプルなシステムを作って欲しいです。
594 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 02:59:10 ] どこにでもあると思うが…
595 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 16:54:07 ] >>593 use CGI; my $cgi=new CGI; my $n=$cgi->param('n')+1; print $cgi->header(-charset=>'Shift_JIS'), $cgi->start_html(-lang=>'ja',-encoding=>'Shift_JIS',-title=>'simple count'), $cgi->a({href=>"$ENV{'SCRIPT_NAME'}?n=$n"},$n), $cgi->end_html;
596 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 00:02:04 ] >>593 <?php if (! $HTTP_COOKIE_VARS{'Num'}) { $start=0; $i=1; setcookie("Num",$i,time()+30); } else { $i=$HTTP_COOKIE_VARS{'Num'}+1; setcookie("Num",$i,time()+30); } echo $start.$HTTP_COOKIE_VARS{'Num'}."<br>\n"; echo "<form method=POST action=><input type=submit value=count_up></form>\n"; ?>
597 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 01:41:37 ] >>593 <input type="button" value="0" onclick="this.value++">
598 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 02:06:11 ] どんどん簡易な物になってくな
599 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 20:10:06 ] つーかスレタイに反してPerlですらなくなってるな このスレ自体がアレなのは確かだが
600 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 00:49:26 ] 待て待て、Web物とは一言も言ってないぞ? # CUI use Term::ReadKey; binmode STDIN; ReadMode 3; print my $count = 0; print "\r", ++$count while (defined ReadKey 0); ReadMode 0; # GUI(Perl/Tk)版 use Tk; my $count = 0; my $mw = MainWindow->new(); my $label = $mw->Label(-text => $count)->pack(); $mw->Button( -text => 'Count up', -command => sub { $label->configure(-text => ++$count) }, )->pack(); MainLoop;
601 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 12:46:48 ] Term::ReadKey を入れてないおいらが来ましたよ。 #!/usr/bin/env perl print my $i = 0 ; $i ++ ; system "stty -echo" ; print "¥e[1K" . $i ++ while <STDIN> ; system "stty echo" ; このスクリプト ( hoge.pl )、perlcc が通ったのには笑った。@5.6.6 perlcc -o counter hoge.pl
602 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 13:24:24 ] なんで笑えるのかわからんが、もっと短くしてみた。 perl -e '`stty cbreak -echo`;print $i++,"\r" while getc'
603 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 13:49:37 ] cbreakはサポートしてないものもあるよ
604 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 17:11:49 ] >>602 いや system 関数ってみるからにコンパイルの時コケそうじゃないですか。
605 名前:デフォルトの名無しさん [2006/08/06(日) 00:00:47 ] 頭が混乱してきた。 ETRADEのポートフォリオのページを取得するスクリプトつくって。 6時間考えたけど、いっぱいいっぱい。だめぽ
606 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 00:29:53 ] 既製品を探すという作業を飛ばしたようだね。
607 名前:デフォルトの名無しさん [2006/08/06(日) 00:52:42 ] >>605 だけど。 やっとできたよ。 しばらく POSTとGETの仕組みと INPUTタブの仕組みを 忘れてた。
608 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 03:44:01 ] inputタブだってよ
609 名前:デフォルトの名無しさん [2006/08/08(火) 10:10:47 ] ディレクトリ内にある.jpgファイルを全て 1.jpg, 2.jpg, 3.jpg, ... というように連番のファイル名に変換するプログラムを つくって頂けませんか。 そのディレクトリには.jpgファイルしか置いてません。(全部変換する) もともとのファイル名は、*****.jpg もしくは ******.jpg (*は数字) という形です。 こういうプログラムを作るのにperlが適しているのかどうかはわからないのですが、 他に作成依頼できそうなスレがみつからなかったので。 お願いします。
610 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 10:16:02 ] folderの中にある複数の圧縮ファイル(zip, rar)の中のファイルの情報の一覧(text fileでOK) を作ってくれるscriptがほしいです。
611 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 10:55:06 ] >>609 perl -e'my $i = 1; foreach(glob("*.jpg")) { rename $_, "$i.jpg"; $i ++;}' 動くかどうかはしらん
612 名前:609 mailto:sage [2006/08/08(火) 11:52:55 ] >611 できてるぽいです! ありがとうございます。
613 名前:デフォルトの名無しさん [2006/08/08(火) 16:23:26 ] アクセスしてきたPCのポートスキャンをするcgi 目的:自分のPCのセキュリティーチェックをしたいので
614 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 18:06:17 ] 嘘付け
615 名前:613 mailto:sage [2006/08/08(火) 18:24:59 ] 最初はIPアドレスを入力して入力されたIPをもつPCのポートスキャンができるようにとおもったのですが、 >>614 さんのように邪推される方がいると思ったのでアクセスしてきたPCのポートスキャンということにしました。 さらにいうなら、IDパスワード認証をしてそのチェックを通過した人だけセキュリティーチェックできるようにお願いします。 もっともIDパスワードをさらしておいて他人のPCのポートスキャンができることも懸念されますが・・・・。。
616 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 16:45:15 ] >>610 while (<*>) { if ((/\.zip$/i) or (/\.rar$/i)) { open(AAA, "unrar l $_ |") || die "err"; $list = <AAA>; close(AAA); } } こんなもんで、よろしいんじゃないですか?
617 名前:デフォルトの名無しさん [2006/08/24(木) 20:33:41 ] perl -e '`stty cbreak -echo`;print $i++,"\r" while getc'
618 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 14:53:13 ] LINUXのCRONで動かしているPerlがあるんだが、自分自身2重起動を阻止したい。 リクエストお願いします。
619 名前:デフォルトの名無しさん [2006/08/30(水) 15:34:33 ] >>618 例えばlockファイルを使う。perldoc -q lock use Fcntl qw(:DEFAULT :flock); sysopen(LCK, "/tmp/lockfile", O_WRONLY|O_CREAT) or die "open: $!\n"; flock(LCK, LOCK_EX|LOCK_NB) or die "flock: $!\n"; sleep 100;
620 名前:デフォルトの名無しさん [2006/08/31(木) 19:03:19 ] なんじゃそりゃ
621 名前:デフォルトの名無しさん mailto:sage [2006/09/07(木) 21:41:40 ] 5分経過したら再認証のページに飛ぶものを作って下さい。 お願いします。。。
622 名前:デフォルトの名無しさん mailto:sage [2006/09/07(木) 21:50:03 ] >>621 仕様がはっきりしなさ過ぎて無理
623 名前:デフォルトの名無しさん mailto:sage [2006/09/07(木) 22:12:49 ] >622 タイムアウト処理だけでも無理ですか?
624 名前:デフォルトの名無しさん mailto:sage [2006/09/07(木) 23:40:42 ] 同じ学校のやつか? 964 名前:デフォルトの名無しさん 投稿日:2006/09/07(木) 21:36:27 質問です! ログインして10分経過後、再認証を行なうプログラムについて教えて下さい。 学校の課題なんですがさっぱり分りません。。。
625 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 00:13:21 ] マルチかよ
626 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 16:15:04 ] >>623 sleep(300);
627 名前:デフォルトの名無しさん [2006/09/08(金) 19:48:59 ] >>621 鯖に「ID=************が何時何分何秒にログインした」ってファイルを 作っておいて、その人がCGIにアクセスするたびに最終ログイン時刻を チェックする。規定時間をオーバーしていると、ログイン画面に飛ばす。 って感じのやつはダメ?
628 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 05:37:49 ] そーいや前に、タイムアウトの処理を HTMLのタグでやってるの見たことある ブラウザ側で簡単に回避されるっての…w
629 名前:デフォルトの名無しさん [2006/10/22(日) 15:34:50 ] マルチにマジレス カコワルイ
630 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 11:35:28 ] 質問させてください 「開始」と「終了」の間に入っている文字列をリンクアドレスにするにはどうすればいいですか? たとえば$STR="開始test.html終了"; とあったとき 出力結果が <a href=test.html>test.html</a>になるようにしたいんです。 $START="開始"; $END="終了";
631 名前:デフォルトの名無しさん [2006/10/23(月) 12:07:01 ] 2chに書き込むスクリプトってどうやるんですか?
632 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 12:34:24 ] 2ちゃんねる2GETスクリプトの改良おねがいします pc8.2ch.net/test/read.cgi/tech/1161552012/
633 名前:デフォルトの名無しさん [2006/10/23(月) 12:46:54 ] Perlでつくってください
634 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 13:30:24 ] >>630 正規表現で一発やん
635 名前:デフォルトの名無しさん [2006/10/23(月) 14:49:23 ] >>634 ごめんなさい、わからないんです。 とりあえず、ここまでは出来ました 「開始」と「終了」に挟まれる$1を抽出した後、その$1をURL形式に変えてアドレスにして置き換えていきたいんです。 例えば $in{'data'}="開始なにか終了hogehogehoge開始てすと終了"だったとしたら これが $in{'data'}="<a href=hoge.com/hoge.cgi?keyword=%42%28%39> なにか</a>hogehogehoge<a href=hoge.com/hoge.cgi?keyword=%32%86%26> てすと</a>" みたいな形式に置き換えたいんです use URI::Escape; $START="開始"; $END="終了"; $SEARCHADD="hoge.com/hoge.cgi?keyword="; while ($in{'data'}=~ m/$START(.*)$END/g) { $output = $1; $urikeyoutput = uri_escape($output); $in{'data'} =~ s/$START$output$END/<a href=$SEARCHADD$urikeyoutput>$output<\/a/g; }
636 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 16:03:57 ] >>635 > while ($in{'data'}=~ m/$START(.*)$END/g) { これを while ($in{'data'}=~ m/$START(.*?)$END/g) { ってすりゃいいんじゃないか? (.* じゃなくて .*? ってことね)
637 名前:デフォルトの名無しさん [2006/10/23(月) 16:23:43 ] >>636 変えてみましたけど、無理でした while ($in{'data'}=~ m/$START(.*?)$END/g) { の時点で拾ってきてくれてないみたいです 書き方おかしいですか?
638 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 16:53:05 ] >>637 while ($in{'data'}=~ m/$START(.*)$END/g) { ... の中で更に $in{'data'} =~ s/$START$output$END/ ... なんてしてるから マッチ開始位置がおかしな事になる。下の一文で済む。 $in{'data'} =~ s{\Q$START\E(.*?)\Q$END\E} { my $url = $1; my $query = uri_escape($url); qq|<a href="$SEARCHADD$query">$url</a>|; }eg;
639 名前:デフォルトの名無しさん [2006/10/23(月) 16:58:47 ] >>638 ご回答ありがとうございます。 その方法で問題なく出来ましたが 開始、終了のペアが2つ以上でてきた場合エラーが発生します。 $in{'data'} ="開始テスト1終了開始テスト2終了"; だったとき 最初の開始から 最後の終了までを1つだと思っているみたいです
640 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 17:16:50 ] >>639 大方 (.*?) を (.*) と写し間違えているんだろう。
641 名前:デフォルトの名無しさん [2006/10/23(月) 17:19:31 ] >>640 >>638 さんのものを、そのままコピペして使ってるのですが >>639 に書いた症状が出ます
642 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 18:37:03 ] infosys.gsid.nagoya-u.ac.jp/~ohna/re/intro2re2.html
643 名前:デフォルトの名無しさん [2006/10/31(火) 00:40:22 ] データが壊れないカウンタを20行で作ってみてください
644 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 01:27:13 ] なんのカウンタだよアホ
645 名前:デフォルトの名無しさん [2006/10/31(火) 02:57:14 ] ロックファイルを作りながら カウントしていくだけのプログラム
646 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 13:23:42 ] だから何をカウントするんだよ。 CGIなら板違いだ
647 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 17:57:33 ] ++$count; 完成!
648 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 11:41:54 ] 画像の横幅を習得するにはどうすればいいんですか?
649 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 12:19:20 ] >>648 search.cpan.org
650 名前:648 mailto:sage [2006/11/03(金) 12:26:30 ] すみませんが、自己解決しました。
651 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 13:29:13 ] 解答が出たあとに自己解決かw
652 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 19:53:30 ] >>643 これでいいんか? open my $fh, ">>count.dat"; print $fh "\n"; close $fh; print "Content-Type: text/plain\n\n"; print -s "count.dat";