1 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:17:36 ] "The duct tape of the Internet" こと、Perl についての質問箱です。 "There's more than one way to do it" ということで、 Perl の奥深さについて皆で語り合い、追求してまいりましょう。 CGI についての質問は板違いです。WEB プログラミング板でどうぞ。 CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。 (WEB プログラミング板: pc11.2ch.net/php/ ) CGI の質問は答えが Perl と全然関係ない話に帰着する場合が 多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 www.perl.org/get.html ● 2009/02/09 現在の最新版: 5.10.0 ▼ 前スレ Perlについての質問箱 38箱目 pc11.2ch.net/test/read.cgi/tech/1221967332/ リンク集は >>2-3 Perl 日本語処理の基礎の基礎 >>4 過去スレは >>5-6 あたり
369 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:19:42 ] # YYYY-MM-DDをその翌日に置き換える場合 # ただし13月32日とかも引っ掛かって甘いので注意 # しかも、最終更新日以外でも、くだんの正規表現に引っ掛かった値が変換されるので注意 use strict; use warnings; use File::Slurp; use DateTime; my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして my $file = read_file($file_name, array_ref => 1); LINE: foreach my $line (@$file) { $line =~ s{ (\d{4}) - (\d{2}) - (\d{2}) }{ DateTime->new(year => $1, month => $2, day => $3) ->add(days => 1) ->ymd(); }xmse; } write_file($file_name, $file);
370 名前:362 mailto:sage [2009/03/21(土) 22:19:54 ] すみません... そもそも、から行きますと、 A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいい です。 営業日ではなく暦日でOKです。 土日祝日もインフラが停止しなければ365日毎朝更新したいです。 というのは、会社のデータベースからあるまとまった形のデータを Excel形式で落としてきて、それにパスワードをかけて、所定のフォルダに アップロードし、それを地方拠点にイントラウェブで提供します。 最終更新日を更新したいというのは、そのアップロードの案内ページなんです。 データを落としてきて、パスワードをかけて、所定のフォルダにアップロード するところまでは、マクロとMS-DOSのバッチファイルとタスクスケジューラと、 恥ずかしいうにょうにょなやり方でどうにか実現しました。 が、そうしたところ、案内のhtmlファイルも自動で日付を変えられるだろうと、 偉い人から言われまして...
371 名前:369 mailto:sage [2009/03/21(土) 22:22:40 ] Template-Toolkit(Template)とかHTML::Templateを使う手もあるね。 ただ、>>370 の書き方を見ると、 土日でもアップロードされたデータが更新されているなら、 touch sample.html してアップロード案内ページだけ最終更新日時を変えれば、 A)はB)と同じになるよね。 そうすればSSIでもやれるんじゃないかな?
372 名前:362 mailto:sage [2009/03/21(土) 22:22:46 ] >>369 さんありがとうございます。 さっそく明日試してみます。 SSIについては鯖管さんに相談してみます。 そういうとこ、小回りのきかない、相談窓口も親身になってくれない 会社です。。。
373 名前:369 mailto:sage [2009/03/21(土) 22:26:43 ] うい、367=369=371れす。 鯖管は別なのか……。 まあ、SSIを検討してみてよ。日曜なのに大変だね。 もしPerlでどうしてもやりたいなら、>>369 を使う場合、 DateTimeとかFile::Slurpは標準では入っていないから、 CPANから導入出来るかも聞いておいて。
374 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:29:14 ] あー、LINE:も要らないし(逐行処理の名残)、そもそもよく考えたら my $file = read_file($file_name, scalar_ref => 1); して $file =~ s{略}{略}xmseg; すりゃよかったか。 しつこくてごめん。
375 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:33:23 ] さらにしつこいが、scalar_refするなら$$fileを置換に突っ込むんだった罠。 チラ裏。 >>322 が気になった今日この頃。比較表とかないかな?
376 名前:362 mailto:sage [2009/03/21(土) 22:40:12 ] 重ね重ね、ありがとうございます。 日付を表記するのに、yyyy-mm-ddは、そのhtmlファイルでその更新日の 部分だけにしてあります。よくわからないなりに、ここだけは見つかるように、 ここだけの形にしておかなければいけないだろうと思いました。 CPANからの導入についても明日確認してみます。 正規表現の本もperlの本も、いつか勉強しなければと積ん読になっています。 (恥ずかしながら) ところで私、普段はぜんぜん違う板の住人です。切羽詰まってここに来ました。 こんなに速くレスをいただけるとは思っていませんでした。 本当にありがとうございます。 perl、勉強しますね。今はお金とか在庫とかの勘定ばかりやっていますが、 小学生の頃はベーマガとかで勉強したクチです。 おやすみなさい。
377 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:41:04 ] PBPとtokuhiromの受け売りだが、 13月32日に引っかけないためにはRegexp::Commonを使おう
378 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 00:28:52 ] >>369 これはちょっとマズいんじゃないの? コメントでは YYYY-MM-DD と書いてるけど、実際の処理が \d{4}-\d{2}-\d{2] では、全然年月日じゃない文字列にもマッチしかねない。 もちろん年月日かどうか完璧な判定はできないけど、 >>362 にあるようにマッチさせる文字列が昨日の日時でいいなら そういう風に限定すべき
379 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 01:19:26 ] 某所で再びFizzBuzz問題がはやっているようなのでPerlで書いてみました!添削してください! perl -e 'for ($n=1;$n<16;$n++) {my$res;!(($n%3||($res="Fizz"))&&($n%5||($res=$res."Buzz")))||($res&&print "$res\n")||(print "$n\n");}'
380 名前:戦犯369 mailto:sage [2009/03/22(日) 02:48:29 ] >>378 thxです。 ついでに、sample.htmlのエンコードを考慮してみた。 # UTF-8(BOMなし)で保存してね use strict; use warnings; use utf8; use DateTime; use Encode::Guess; use File::Slurp; # ファイルの中身を変数に突っ込む my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして my $file = read_file($file_name, scalar_ref => 1); # ファイルのエンコードを類推して、UTF-8に変換する # 決め打ちならこんなことをせず、use Encodeしてdecode, encodeする my $encoding = guess_encoding($$file, qw(cp932 euc-jp utf8)); die "Can't guess" unless ref $encoding; if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') { $$file = $encoding->decode($$file); } # 昨日のYYYY-MM-DDを得る my $yesterday = DateTime->now(time_zone => 'local') ->add(days => -1) ->ymd(); # つづく
381 名前:戦犯369 mailto:sage [2009/03/22(日) 02:49:50 ] # つづき # >>362 式なら # my (undef, undef, undef, $day, $month, $year) = localtime(); # my $yesterday = sprintf("%04d-%02d-%02d", $year + 1900, $month + 1, $day - 1); # ファイルの中身で昨日のYYYY-MM-DDに合致すれば変換する $$file =~ s{ ($yesterday) }{ # ファイルに書いてある最終更新年月日(昨日)を、 my ($year, $month, $day) = split q{-}, $1; # 翌日(つまり今日)に変換する DateTime->new(year => $year, month => $month, day => $day) ->add(days => 1) ->ymd(); # >>362 式なら # sprintf("%04d-%02d-%02d", $year, $month, $day + 1); }xmseg; # ファイルのエンコードを元に戻す if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') { $$file = $encoding->encode($$file); } write_file($file_name, $file); __END__ まあ、 SSI > テンプレート使用 > ベタ置換 の順が楽なんだろうけど。
382 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 02:57:58 ] なにを持って善しと成すのかわからんけど、俺も作ってみた perl -e 'for(1..15){my$r;$_%3or$r="Fizz";$_%5or$r.="Buzz";$r or$r=$_;print"$r\n"}' 添削してくだちぃ
383 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:12:33 ] 個人的には、勉強するためならいきなりCPANに頼るのはどうかと思った。 いきなりDateTimeを使わずにsprintfでやった方がいいし、 いきなりFile::Slurpを使わずにopen関数を使った方がいいと思うけど、 面倒くさすぎて放り投げられるとPerlスキーとしては寂しいので、 CPANに依存してみた。今は反省している。 FizzBuzzについては、 1. 要件を実現出来ているんなら、 2. ワンライナーなら、 3. FizzBuzzでゴルフしたり難読化選手権を開くんじゃなければ、 多少腕白でもいいと思うけどね、俺は。 敢えてPBP的に見ても、 a. C的なforでなくforeachを使おうとか、 b. $_でなくてちゃんとforeach my $num (1 .. 15)にしようとか、 c. ""で括らなくていいときは''で括ろうとか、 そんなつまらない指摘しか出来ないけど。 あとはあれか、>>379 なら、C的なforをどうしても使うときは、 $n <= 15の方が直感的とかか。
384 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:20:37 ] あ、うそ、ごめん。 >>381 の二つめの>>362 式は、3月32日になるw ゆえに素直にDateTime使おう。
385 名前:379 mailto:sage [2009/03/22(日) 03:36:54 ] >>382-383 ありがとうございます!>>382 さんのコードの方がPerlっぽくていいですね。 ぼくのはJavaとかでも使えるテクしか使ってないや。 最近Perlはワンライナーしか書かなくなってさっぱり鈍ってしまった。
386 名前: ◆TWARamEjuA mailto:sage [2009/03/22(日) 10:10:15 BE:6861097-BRZ(10001)] 1日前ってそんなに難しいのかしら? time - 86400 でよさそうな。。。
387 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 10:34:11 ] うるう秒をちゃんと扱わないシステムならな
388 名前:デフォルトの名無しさん [2009/03/22(日) 11:15:10 ] >>387 UNIX時はどれも閏秒は算定してないと思うが。 システムによって現在のUNIX時が食い違ったら困るだろ。
389 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:00:39 ] 超頭悪い会話が繰り広げられている
390 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:15:46 ] >>389 >>389
391 名前:362 mailto:sage [2009/03/23(月) 05:38:24 ] おはようございます。 ご報告が遅くなりました。 >>381 さんに教えていただいたスクリプトを昨日、会社で使って (ファイル名など一部変えました)、まだ1日(1回)だけですがテストとしては うまく動いたようです。 今朝出社してうまく書き換わっているかどうか。これから出勤です。 うまくいったら引き続き使います。 ではみなさま、また縁がありましたらどうぞよろしくお願いします。
392 名前:デフォルトの名無しさん [2009/03/23(月) 07:49:00 ] >>389 仕様上はどちらでもいいことになっているが、先発製品との互換上、 どのシステムもうるう秒は算定していない。 うるう秒はいつ発生するか算定できないからどっかから情報取得する必要があるし、 tarファイルを移転する時とか、NTP使う時とか困るだろ。 よほど金融系のシステムとかでなければ、NTPクライアントを随時走らせておけば大きな支障はない。
393 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 09:22:29 ] いちおうtzfile(5)とか見ればわかるけどうるう秒扱えるようにはなって いるんだよね。 実用上はうるう秒のたびに時計を進めたり戻したりして1日の秒数は 一定としてしまうのが楽な場合がほとんどだから設定した例は自分の 周りでは見たことない。 天文とかは過去のある時刻との間の時間みたいのをきっちり出せない と困りそうだけど。
394 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 09:23:10 ] うるう秒を勘案するシステムは存在しないってこと?
395 名前:デフォルトの名無しさん [2009/03/23(月) 13:06:04 ] >>394 一般的なUNIXtimeの扱いの話であって、 そういったシステムが存在しないとは誰も言ってない。 極端な話、協定世界時を管理してるシステムなんかは当然勘案しなきゃ困るでしょ。
396 名前:526 [2009/03/24(火) 19:51:11 ] ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。 debian etch の上で、perl-tk をいれて触っています。 どうにも日本語が表示されませんので、どなたか詳しい人、アドバイスをお願いします。 perlは、 v5.8.8 perl-tkは、804.027-7 です。 よろしくお願いします。
397 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 04:25:03 ] エスパーじゃないんだからさ、それじゃ答えようがないよ。 とりあえず>>4 あとやったこと書け
398 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 14:49:23 ] ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。 昨日から体の具合が悪いんですが、何かの病気でしょうか? どなたか詳しい人、アドバイスをお願いします。 どんな薬を飲めばいいですか?医者に診せたほうがいいですすかね・・・ 何科の医者に行けばいいですか? よろしくお願いします。
399 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 14:53:25 ] エスパーじゃないんだからさ、それじゃ答えようがないよ。
400 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:06:54 ] @test 赤、A、あ、 #$test{0} 黄、A、い、 #1 青、A、あ、 #2 赤、B、あ、 #3 赤、C、い、 #4 青、A、あ、 #5 例えばこういう配列があったとして 各項目ごとに一番多い文字列(赤 A あ)をそれぞれ取り出したいんですがどのようにすればいいんでしょうか?
401 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:28:24 ] 「こういう配列」
402 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:36:06 ] >>400 my @dat = ( 'red,A,a', 'yellow,A,b', 'blue,A,a', 'blue,B,a' ) ; my @cache ; for ( @dat ){ my $cnt = 0 ; $cache[$cnt++]->{$_} ++ for split /,/ ; } printf "%s\n", sort { $_->{$b} <=> $_->{$a} } keys %{$_} for @cache ; 日本語? => 自分で考えて 同じ個数の物があったら? => 知らん。
403 名前:デフォルトの名無しさん [2009/03/25(水) 23:32:24 ] ○○.cgiのプログラムで、 「exec △△.pl $param1」とexecを使用して呼び出しても、 呼び出し先の△△.plが実行されないです。 環境が原因と思うのですが、 初心者で何が原因かわからないです。
404 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 12:16:36 ] >>400 二次元配列のようでもあるし、コメント見るとハッシュにしてるし… せめてPerlの書式で書いてくれ
405 名前:400 mailto:sage [2009/03/26(木) 18:21:17 ] >>402 レスありがとうございます。 ただちょっと仕様を変更したので、普通の配列の中から一番多い要素を取り出すものに変えようと思ったのですが、 初心者なため>>402 のコードでわからない部分があり、改良することができません。 どなたか配列の中で一番多い要素を取り出すサブルーチンを書いていただけないでしょうか。
406 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 18:50:35 ] >>405 いくら出すかも書いておくと話が早いよ
407 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 18:52:32 ] www.seshop.com/detail.asp?pid=6160 『10日でおぼえる Perl /CGI入門教室 第2版 』2005/9/5発売。 を購入しようと思っています。 この書籍が出た時点のバージョンのPerlをWindowz Vistaで 動かすことは可能でしょうか?バクがでたりエラーなどは大丈夫でしょうか? これからPerlを勉強するので詳しいことはわかりません。 なお、PHP関連の書籍に付録で付いていたXAMPP1.6.5はインストール済みで 少なくともVistaで動作確認済みとPHPの書籍にありました。 どなたか回答よろしくお願いいたします。
408 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 19:32:34 ] perl タダなんだから、自分でダウンロードして確かめてみればいいじゃん。
409 名前:405 mailto:sage [2009/03/26(木) 20:37:12 ] しくしく。。。 どう書けばいいのかわからないんです、アドバイスください @array = ('マグロ','鯛','イワシ','鯛','マグロ','鯛'); &extract(@array); #一番多い要素を書き出す sub extract { foreach (@_) { $hash{$_} ++; } while (($key, $value) = each(%hash)) { push(@test, $value); } @sort = sort{$b <=> $a} @test; $shift = shift(@sort); $aa = $hash{$shift}; print "$aa"; }
410 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 20:44:10 ] っ「List::Utilのmax」
411 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 22:47:29 ] >>409 初心者をあまりいじめるのも可哀想なのでとりあえず書くけど、正直なところもっとちゃんと自分で調べてほしい。 >>402 のヒントがあれば本を読むなりウェブでリファレンスを引くなりして調べようがあるとおもう。 人のコードを盲目的にコピペするのではなくて、ちゃんと一行一行やってることを理解するようにしないと上達しないよ。 シンタックスシュガーはあえて封じた。 use strict; use List::Util qw(max first); my @data=('foo','bar','poo','foo'); my %cache; foreach my $entity(@data) { $cache{$entity}=$cache{$entity}+1; } my $maxval=max(values(%cache)); my $res=first(sub{$cache{$_}==$maxval},keys(%cache)); print $res."\n";
412 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 17:23:43 ] >>409 #一番多い要素を書き出す sub extract { foreach (@_) { $hash{$_} ++; if($max < $hash{$_}){ $max = $hash{$_}; } #追加 } while (($key, $value) = each(%hash)) { if($value == $max){ print $key,"\n"; } #追加 } }
413 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 20:50:08 ] sub extract{ my %hash; my $res = $_[0] ; for ( @_ ){ next if ++ $hash{$_} < $hash{$res} ; $res = $_ ; } return $res ; }
414 名前:デフォルトの名無しさん [2009/03/30(月) 04:58:54 ] リストの略記法って (1..10) しかないんでしょうか (1がずっと続くよ) みたいな書き方が知りたいです
415 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 07:28:29 ] (1) x 10
416 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:31:19 ] DB_Fileってundefは保存できないんですか ""とundefどうやって区別したらいいんでしょうか
417 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 10:15:31 ] >>415 どもです
418 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 13:31:20 ] 分類と項目が並んでいるリストがあったとして 各項目はいくつかの分類のどれかに属していて、 分類ごとにまとめて処理をしたいので、 項目のリストを分類別に作りたい for (keys %class) { for (@items{$_}) { みたいに配列の連想配列が使えるといいのだけれど 何かスマートな解決法はありますか
419 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 13:37:48 ] PerlでWebからのレスポンスを標準出力すると文字化けが発生してしまいます 色々とエンコードも試したのですが解決しませんでした 文字コード判別もなぜか失敗しました ↓がDumpした結果ですが、文字コードは何なのか教えてくれませんか SV = PV(0x1cffd24) at 0x1bbe7e4 REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x1832f24 "G\"\22w\221U\207L\241\300\361l\16\326ao\352d\351\30\265m\303Ox \203\24\213\2262\273\271\274\5\273S\307\323\367b\372\277\340\17\254#\257\206D\24 3\243\243\265\342{4_\254j@\213\266gV\3417\236\237\265\331U\370\266\300\2477\227\ 357\324D!\362&\32\204\233h\325\36l\301S\370\210n\0366\242\373\205lX\203\317\225\ 375\fm\324\322\213\347\324\223\270\360\203'e\253UB\221\"\360l\340\305\211\357Q|u \377\1\24yz\316\302\3\0\0"\0 CUR = 143 LEN = 676
420 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:16:24 ] >>416 defined >>418 ハッシュのキーに分類の名前 ハッシュの要素に項目の配列リファレンスとか入れたらどうだろう $item{分類} = [qw/項目 項目 項目/]; みたいに
421 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:44:36 ] $str =~ s/<hoge>//; という正規表現を使って複数回文字を削除しようとしています while($str =~ /<hoge>/){ $str =~ s/<hoge>//; } とすると無駄な処理が入るので、ループの判別のところだけで処理したいんですが、 そういう書き方は可能でしょうか while($str =~ s/<hoge>//); と書くとエラーを吐かれました do{''} while($str =~ s/<hoge>//); や while($str =~ s/<hoge>//){} だとうまくいきますが、なんか気持ち悪いです
422 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:51:12 ] 1 while $str =~ s/<hoge>//g; かなぁ
423 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:51:37 ] >>421 1 while $str =~ s/<hoge>//; とか $str =~ s/<hoge>//g; とか
424 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:16:08 ] >>420 $class と $itemのセットを記憶するのに、 push(@{$items{$class}}, $item); でいけました @$items{$class} ではないという部分で引っかかりました 念のため[]で初期化したけど、外しても問題なく動くあたりが流石
425 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:39:15 ] >>423 上では無駄な1が気持ち悪いです 下では $str = '<h<hoge>oge>' のときに削除できません…
426 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:48:20 ] >>425 リャマ本に似たようなコード載ってるから、じゃ気持ち悪くならない理由にならない? 上の方は定数式(1)は最適化で取り除かれるんだとさ
427 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:57:42 ] >>426 見た目が気持ち悪いのと処理的に気持ち悪いのは違うんですよ 「全部取り除く」って処理に全く関係ない1なんかがあるのは生理的に気持ち悪いです {}で終わるのも一文なのに;がないから処理が終わってない感じがいやらしいです リャマ本に上が載ってるなら、他にやり方はないんですかね… もしかしたら正規表現で再帰的に検索してくれるオプションがあるかもと思ってたんですが…
428 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 17:21:08 ] >>427 再帰的にやるなら my $hoge; $hoge = qr/<(??{$hoge})?h(??{$hoge})?o(??{$hoge})?g(??{$hoge})?e(??{$hoge})?>/; $str =~ s/$hoge//g; とか? もっと綺麗に書けそうだが。 5.10以降ならキャプチャバッファ(see perl5100delta)使って一行でしかも効率良く書けるはず。
429 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:56:14 ] >>428 トン キャプチャバッファについてググってみます
430 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:59:32 ] >>427 my $str = '<h<hoge>oge>' ; L:{ $str =~ s/<hoge>//g and redo L; } 1 while COND の方が断然気持ち良いけどさ。
431 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 13:55:08 ] 「 気 持 ち 悪 い 」 ・・・か。それじゃC言語の if (a == 1) { hoge(); } なんか、気持ち悪さ1000%だな。 なぜ「等しい」の判定に () が必要なのか。 なぜ hoge を呼び出すのに { } が必要なのか。 なぜ hoge のうしろにも () がくっついてるのか。 アメリカ人は苗字と名前を逆に言う。 住所も番地から逆に言う。 日付も逆に言う。 実に「気持ち悪い」。 だが、そういうもんだ。いちいち疑問にしてたらキリが無い。 順応しろよ、順応。
432 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 13:56:13 ] 自分で拡張すればいい
433 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 14:01:47 ] アッー
434 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 15:41:46 ] >>431 が気持ち悪い
435 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 17:37:19 ] activeperl 5.8.8を使っています -d でフォルダかどうか判断する時に、 5Cで終わっているフォルダ名を正しく扱えません どうやったら回避できますか
436 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 18:30:23 ] 5Cでエスケープしてみては?
437 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 18:58:01 ] ちょっと意味が判らないのですが、 -d "$file\\" という書き方でも結果は同様です
438 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:04:39 ] 必ず失敗するかというとそうでもないようで、 opendir(dir, '.'); for $file (readdir(dir)) { if (-d "$file") {print "$file is directory.\n"} else {print "$file is file.\n"} } これを aaa aaa2― aaa― こんな状況で実行すると . is directory. .. is directory. aaa is directory. aaa― is directory. aaa2― is file. test.pl is file. _ is file. こうなります
439 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:22:59 ] で、何が問題なの?
440 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:51:36 ] aaa2―はフォルダなのに aaa2― is file. となってしまうことが問題
441 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:05:27 ] -dの返り血をちゃんと調べたのか?
442 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:23:03 ] -dの戻り値なんて1か0しか無いのでは
443 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:47:53 ] >>431 至極真っ当 理に叶ってる ()の中はbooleanが必要とされてる {}の中は場合によって処理されるか否かなんだからブロックで囲まれてて当然 だけどwhile(〜){}は関数的に使われてるのにセミコロンがない これが問題 気持ち悪い原因 つまりwhile(〜);と書ければ万事解決なんだよ!!!!
444 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 21:49:19 ] 順応と思考停止と信者脳って紙一重だなぁ、って>>431 見ると思うね。
445 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 21:57:59 ] >>443 while(~){}は while(~){ (); } の省略記法だよ?B::Deparseで確認してみ? 勝手に省略して、省略してしまった部分について気持悪がられても… 「();が気持悪い!」って言われたら、 「そりゃごもっとも、俺もそう思う。」と言わざるを得ないけどさ。
446 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:04:09 ] -f -d -eについても調べたところ、-eにすら通っていない aaa: -f, -d1, -e1 aaa―: -f, -d1, -e1 aaa2―: -f, -d, -e ディレクトリを再帰的に辿って全部のファイルに対して云々、みたいな 処理をさせると、フォルダの末尾が5Cかもしれない問題は必ず発生すると思うんだけど、 どうやって回避してるの?
447 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:04:57 ] 省略記法てーのは正しくないな。 perlではこう解釈されるってのが正しいのか。
448 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:13:47 ] >>446 あなたの環境が何か解らないからスルーしてたけど、 スクリプトのエンコーディングとディレクトリのは合ってるの? winなら>>4 とかそこらへんの問題じゃないの? 私の環境だと問題が出ないから力にはなれません。
449 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:43:19 ] >>4 を入れても改善しないようです aaa: -f, -d1, -e1 aaa?\: -f, -d, -e aaa?Q?\: -f, -d, -e むしろ悪化しています 環境はwindowsXPです
450 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:34:09 ] なんで""つけるんだよ
451 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:20:37 ] >>4 に答えが書いてあるじゃん。なぜそうしない?
452 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:35:54 ] >>4 は、表示で化けるとか、検索とか正規表現がうまく行かないとかの、 日本語の文字列としての取り扱いを完璧にする方法だけど、 ファイルシステム絡みは何も改善しないように見える 唯一、ファイル名をcp932でencodeするように注意はあるけど、 それは必要な処理であって、今回のケースを解決しない
453 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:54:42 ] cygwinと同じ問題じゃないの? ActivePerlがMultiByte系のW32API使ってないんじゃ
454 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:59:15 ] activeperlではどうやっても無理、というはっきりした結論があれば、 他の言語も含めた別の解決法を探すんだけど、 ぐぐってもそのへんを断言した文章は見つからない 逆に、このスレでは口を揃えて出来る出来ると言っている サンプルは1バイトも出てこないけど
455 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 01:53:05 ] Perlでは出来ないし、ここにいるやつらは知ったかぶりの初心者ばかりだから、 PerlはあきらめてPythonでやるといいよ!!
456 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 04:29:43 ] うちの環境で"activeperl エンコーディング readdir"でググって一番上に出てくる homepage2.nifty.com/ttoyoshima/Perl/lesson5.htm には > 「Active Perl V5.8.8」では日本語の「ファイル名」のファイルは開けない。 って書いてあるけど。
457 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 08:13:35 ] >日本語の「ファイル名」のファイルは開けない というのはそのサイトの人がUTF-8のままで処理しようとしているからでは? 別のサイト ttp://www.aritia.org/hizumi/perl/perlwin.html では内部コードはUTF-8でもファイル操作時はShift_JISに 戻せみたいなことが書いてあるが open(IN,encode('cp932',"<表.txt")) or die "open(表.txt):$!\n"; 少なくともまったくできないってことはないだろ
458 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 08:45:49 ] 単に説明が面倒だから、全部できないことにしとけ、という手抜きだろ
459 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 10:27:31 ] PHPにはPEAR::Text_Passwordっていう便利なモジュールがあって、 <?php require_once "Text/Password.php"; $a=new Text_Password; $b=$a->create(8, 'unpronounceable', 'alphanumeric'); echo $b ; ?> このコードを書くだけで、ランダムなパスワードを 自動で生成してくれる。 同じことをperlでやったら65行は書かないといけない。
460 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 10:53:36 ] その65行をライブラリとして使えば変わらん
461 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 11:20:31 ] そのText/Password.phpの中身は何行だよ
462 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 11:46:17 ] PerlにはString::Randomっていう便利なモジュールがあって、 use String::Random; print $a=String::Random->new->randregex('[A-Za-z0-9]{8}'); このコードを書くだけで、ランダムなパスワードを 自動で生成してくれる。 同じことをphpでやったら6行は書かないといけない。
463 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 12:29:06 ] >>449 > >>4 を入れても改善しないようです >>4 には > # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、 > # この例のように cp932 でエンコードする必要があります。 と書いてあるが、なぜそんなことが必要なのか、よく考えてごらんよ。 すると、OS からもらった文字列は逆にcp932 からutf8 にデコード しなきゃならない、という事にも気づけるだろう。
464 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 14:07:20 ] >>463 問題を勘違いしてる 0x5Cがエスケープ文字だからトラブってるのではなくて Windowsのディレクトリセパレータなのが問題
465 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 15:49:06 ] >>464 > Windowsのディレクトリセパレータなのが問題 へ〜、そうなんだ。
466 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 15:54:30 ] >>462 ワロタwww
467 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 17:30:30 ] >>4 に書いてあるとおり、教科書的な書き方をすれば、こうなる。 use utf8; use open IO => ":encoding(cp932)"; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)"; use Encode; opendir dir, encode('cp932','.'); @files = readdir dir; for (@files) { $_ = decode('cp932', $_) } for $file (@files) { if (-d encode('cp932',$file)) {print "$file is directory.\n"} else {print "$file is file.\n"} } ポイント ・OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、utf8 → cp932 に変換すること。 ・逆に OS からもらう文字列(readdirなど)は cp932 → utf8 に変換すること。
468 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:38:39 ] 下記のように1〜5万の数をランダムに表示していき、かつ一度表示した数は表示しないというコードをゴリゴリ書きました。 しかしこれは何故か3万回を超えた辺りから重複による何十回ものスキップ処理が入ってしまいます。 3万回数字を表示した時点でスキップが起こる確率は3/5=60%なので何十回ものスキップが頻発するというのはおかしいです。 (例えば10回のスキップ処理が連続で起こる確率は0.6^10でたった0.6%であるにも関わらず、こういう規模の事象が頻発する。3桁レベルのスキップも起こったりする。) Perlのランダム関数がおかしいとは考えにくいのですが、何故こういう事が起こってしまうんでしょうか?教えてください。 $starttime = (times())[0]; $sessionstarttime = (times())[0]; $count=1; $skipcount=0; @triedNumbers=(); print " count skip num total this\n"; while(1){ $number = int(rand(50000))+1; $new = 1; foreach(@triedNumbers) { if($number == $_) { $skipcount++; $new = 0; last; } } if($new==0){next;} push(@triedNumbers,$number); $endtime = (times())[0]; $totaltime = $endtime-$starttime; $sessiontime=$endtime-$sessionstarttime; printf "%6d %4d %6d %3ds %3ds\n", $count, $skipcount,$number,$totaltime,$sessiontime; $sessionstarttime = (times())[0]; $skipcount=0; $count++; }
469 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:40:13 ] 環境は以下です。 This is perl, v5.8.8 built for MSWin32-x86-multi-thread WindowsXP SP3
470 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:54:55 ] Win32::APIガリガリ叩いてやればできたはずなんだけど、英語の記事だったから読んでないしどこでみたかも覚えてない
471 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:03:36 ] >>468 This is perl, v5.8.9 built for i386-freebsd-64int だと以下のようになるが。 32264 3 48037 119s 0s 32265 4 43101 119s 0s 32266 2 38633 119s 0s 32267 2 31075 119s 0s 32268 0 8513 119s 0s 32269 1 49402 119s 0s 32270 1 27972 119s 0s 32271 0 32400 119s 0s 32272 3 28045 119s 0s 32273 0 35972 119s 0s 32274 0 22672 119s 0s 32275 1 44140 119s 0s 32276 2 32443 119s 0s 32277 2 41433 119s 0s 32278 2 33357 119s 0s 32279 0 6772 119s 0s 32280 2 26341 119s 0s
472 名前:468 mailto:sage [2009/04/02(木) 19:03:40 ] 当初の目的は下のコードでさくっとできるようになりました。 >>468 のスキップ多発については原因が分かりません。 @numbers=(); for my $i (1..50000){ push(@numbers,$i); } for my $i (0..$#numbers){ $rand = int(rand(@numbers)); $tmp = $numbers[$i]; $numbers[$i] = $numbers[$rand]; $numbers[$rand]=$tmp; } for my $i (0..$#numbers){ print "$i:$numbers[$i]\n"; }
473 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:10:27 ] >>468 所詮線型合同法だろ? 偏りあるしそんなもんよ。 List::Utils::shuffle(1..50000) じゃダメなのか。
474 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:11:18 ] >>472 それは偏りが出るまずいアルゴリズム。 っ「Fisher-Yates shuffle」
475 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:21:05 ] >>468-469 その環境での乱数の有効ビット数が15だから。 rand(1)が返す数の種類が32768通りしか存在しないので、3万時点のskip確率は90%以上。 乱数のビット数は use Config して $Config{randbits} で確認できる。
476 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:55:54 ] >>467 でも結果は同じ aaa is directory. aaa― is directory. aaa―2 is directory. aaa2― is file. テスト結果で書くと aaa: -f, -d1, -e1 aaa―: -f, -d1, -e1 aaa―2: -f, -d1, -e1 aaa2―: -f, -d, -e こんなん aaa―2みたいに途中に5cを含む場合はエスケープとか無しに普通に扱える aaa―が何で通るのかが謎だけど、 aaa2―みたいなのは、aaa2―/hoge みたいにフォルダ内のファイルを 直接指定してもエラーになる 結論としては、そんなフォルダ名を使うな、ということになる ファイル名もNGなんだけど、大抵は拡張子があるので、問題になることがない
477 名前:468 mailto:sage [2009/04/02(木) 20:08:30 ] >>471 ,473,474 乱数の有効ビット数というのが原因のようですね。 手持ちのWindowsだと15でしたがLinuxでは48でした。 Fisher-Yates法では偏りが出る様なので>>473 の方法でやってみようとおもいます。 レスありがとうございました。
478 名前:468 mailto:sage [2009/04/02(木) 20:10:03 ] >>475 さんもありがとうございました。
479 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 20:13:48 ] >>476 aaa― が通るのは aaa があるから。 aaa2―/hogeの失敗は、何らかの単純ミスの可能性が高い。 >>446 >どうやって回避してるの? @dirs=split /[\r\n]+/,`dir /s/b/aD`; とか? 再帰? 再帰って何だ? ファイルテスト演算子内から呼ばれるwin32_stat()内で終端の\を加工してるのが直接の原因。 なんでも FindFirstFile() and stat() are buggy with a trailing backslash, なので、 so change it to a forward slash (〜5.8.7.815)とか、 remove additional trailing slashes (5.8.8.816〜)という対策をしてるとの事。 -dを使う限りstatを避けることは出来ないが、There's More Than One Way To Do Itという 決まり文句を持ち出すまでもなく回避するには数多くの方法がある。 1.くどいけど @dirs=split /[\r\n]+/,`dir /b/aD`; 2.Win32::FileにGetAttributesがあるのでソレを使う 3.Win32API::FileやWin32::APIで好き勝手にやりたい放題? 4.面倒だから -e "${fn}/." で代用 (chdir/opendirにも使える/-fはopenで代用) X. グロブ(<*>)を使うと、statに通らないファイル名は入ってこない 正しい対応.バグレポートを出し、余裕があればパッチも投稿する。 例えば、WideChar化してから終端加工して再度MultiByteに戻すとか。 楽な対応.そんなフォルダ名は使わない、見つけたら即リネーム
480 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 20:47:30 ] >>467 の > if (-d encode('cp932',$file)) {print "$file is directory.\n"} がおかしいんじゃないの? エンコードするから、sjis の2バイト目の0x5Cが復活する。 if (-d $file) {print "$file is directory.\n"} でうまくいくと思うが。
481 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 21:18:47 ] >>479 詳しくd -d 以外にテストの方法があったとしても、 次にそこに対してopendirすると失敗するので、結局目的は果たせない 例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム 5.10.0 とか 5.8.9.825 では直っているかしら
482 名前:PHPの神 mailto:sage [2009/04/02(木) 22:15:14 ] >>462 お前は何か勘違いしているようだな、、、 PHPでは 「発音できないパスワードを生成する」 とか、そういうことができるんだぞ
483 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:52:56 ] ここって教えてくれる人がたくさんいていいな・・・ VBAスレなんて、、、
484 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:19:33 ] →
485 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:45:06 ] VBAを使う人というのは、VBAを使っても 嘔吐感、嫌悪感が生じない人なんだろ? なら、数が限られてくるわな。
486 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 15:09:01 ] >>481 最初に479に間違いがあったので訂正。 誤 4.面倒だから -e "${fn}/." で代用 (chdir/opendirにも使える/-fはopenで代用) 正 4.面倒だから -e "${fn}/./" で代用 (chdir/opendirにも使える. -fはopenで代用) 末尾への/.追加だけだと5.8.8以降ではchdirには使えなかった。 chdirの確認を常用してる5.8.7.813でしかやってなかったという単純ミス >次にそこに対してopendirすると失敗するので、結局目的は果たせない >例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム そんなに難しいことをやっているの? ツリー表示程度なら sub tree { # my(@dir,$ent) = map { chomp;$_ } `dir "$_[0]" /b/aD`; # ,`dir "$_[0]" /b/aDH`; #↓は↑の手抜き変形でほぼ同内容 my(@dir,$ent) = eval { opendir my $h,"$_[0]/.";grep {-d "$_[0]/$_/." and !/^\.+$/} readdir $h }; while(defined($ent = shift @dir)) { print "$_[1]+${ent}\n"; &tree("$_[0]/${ent}",@dir ? $_[1].'| ' : $_[1].' '); } } &tree('.'); みたいにopendir無しでも書ける気がするし、opendirも成功しそうな気がするんだが。 opendirに関しては最悪DLL違いでの挙動差もありえなくは無いけどね。
487 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 15:59:30 ] opendirはできなくても、中にあるファイルをopenは出来る だからうまいことすれば大抵のソフトは回避できると思うけど、 そんな僅かなリスクの為に常時opendir禁止というのは辛すぎる
488 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:59:22 ] >>486 >例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム 長いよ。長すぎるよ。そんなん書いたら保守性が悪いだろ。 いいかい? system("tree"); ほら、たった一行でできただろ。
489 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:53:37 ] treeコマンドのあるOSだけじゃないし
490 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:48:39 ] 5C が問題になるOSには、たいてい tree コマンドはあるよ。
491 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:27:34 ] Perlを使う人というのは、Perlを使っても 嘔吐感、嫌悪感が生じない人なんだろ? なら、数が限られてくるわな。
492 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:25:46 ] 優越感と陶酔感が生じますよ
493 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:30:46 ] >>492 ぷw
494 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 02:26:05 ] >>432 田植えならしかるべきとこでやっていただきたい あーゲシュタルト崩壊してきた
495 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:24:11 ] Perl使ってるひとはいつもこんな主張 "他の言語は使えないから、Perlが一番いい" Perlの良いことを一言も言えない
496 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:51:14 ] ポテンシャルを語るのに飽きたひと いわゆるYAGNI みたいな?
497 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:57:42 ] 良い点なんて他との比較でしか論じれないからな とりあえずperlが使えれば、好奇心以外に他の言語に乗り換える動機が発生しにくいので、 perlしか使わない人がおおい
498 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 22:22:18 ] Perlの世界って閉じて荘
499 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:35:28 ] そもそもどんな人なら「Perl使ってるひと」を名乗ってもいいのだろうか。 もしかすると>495に答えを授けた自称「Perl使ってるひと」も >497の「perlしか使わない人」も「Perl使ってるひと」ではないかもしれない。
500 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 19:11:10 ] if(($str =~ /hoge\((.*?)\)/) && ($str =~ /foo\((.*?)\)/)){ $str =~ /hoge\((.*?)\)/; $hoge=$1; $str =~ /foo\((.*?)\)/; $foo=$1; } これをもっと綺麗に書くことってできませんか?できたら教えてください。 hogeとfooの位置が前後する事があるのでこういう書き方にしました。 ・やりたいこと 文中のhoge(あいうえお)とfoo(かきくけこ)から $hoge="あいうえお"; $foo="かきくけこ";という変数を生成したい。
501 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 20:56:00 ] 中のブロックだけでいいのでは(1行目要らないのでは)
502 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:18:19 ] >>500 例えばこんな感じ? @pair = $str =~ /((?:hoge\([^)]*)|(?:huga\([^)]*))/g; foreach my $pair(@pairs){ my($name, $value) = $split '\(', $pair; $name = 'hoge' ? $hoge = $value : $name = 'huga' ? $huga = $value : 1 ; }
503 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:22:23 ] ×$name = ○$name eq 確かに>>501 の通り
504 名前: un001.ecc.u-tokyo.ac.jp mailto:sage [2009/04/06(月) 21:48:05 ] ハッシュを使うのが手っ取り早いと思う。$foo, $hoge を残したいなら my $foo, $hoge; my %refhash = ( foo => \$foo, hoge => \$hoge ); ...行ごとのループとか if (/(hoge|foo)\((.*?)\).*(hoge|foo)\((.*?)\)/) { $r1 = $refhash{$1}; $$r1 = $2; $r2 = $refhash{$3}; $$r2 = $4; ... $foo, $hogeを使った処理 }
505 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:39:27 ] ハッシュの例 my %hash = $str =~ /(hoge|foo)\((.*?)\)/g ; my $hoge = $hash{hoge} ; my $foo = $hash{foo} ; >1行目要らないのでは の例 my ($hoge) = $str =~ /hoge\((.*?)\)/ ; my ($foo )= $str =~ /foo\((.*?)\)/ ;
506 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:54:29 ] 変態の例 my $hoge ; my $foo ; 1 while $str =~ /(hoge|foo)\((.*?)\)(?{ ($1 eq 'hoge' ? $hoge : $foo )= $2 })/g ;
507 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:40:54 ] Singletonパターンってこれでいい? package Foo; my $singleton; sub new { my $class = shift; return $singleton if $singleton; return $singleton = bless {}, ref $class || $class; } 1;
508 名前:500 mailto:sage [2009/04/06(月) 23:52:45 ] # 最初はこうだったんですが if(($str =~ /hoge\((.*?)\).*foo\((.*?)\)/)){ $hoge=$1; $foo=$2; } # 位置関係が前後した場合に対応できない事が分かったので書き直して以下に if(($str =~ /hoge\((.*?)\)/) && ($str =~ /foo\((.*?)\)/)){ $str =~ /hoge\((.*?)\)/; $hoge=$1; $str =~ /foo\((.*?)\)/; $foo=$1; } これを前者と比べるとゴテゴテしてしまったなというところでした。 >1行目のif文 万が一hogeが含まれfooが含まれていないという場合 if文が無いとhogeの値がfooの値にも入ってしまい、それはマズいので入れてます。 ワンライナーな方のコードも読んでみました。$hoge = ($1 eq 'hoge' ? true : false)みたいな用法は知っていましたが、 この方法を右辺にも使えるんですね。自分には新しいです。(?{})というのは知りませんでした。 見た感じ正規表現の中で処理を実行する際に使うんでしょうが調べてみてもうまくヒットさせられませんでした。 もうちょっと知りたいのでキーワードとかあれば教えてください。 $hoge = ($str =~ 正規表現)での代入方法。これ知りませんでした。 あと右辺がリストで左辺もリストだと配列、右辺がリストで左辺がハッシュだと キー、値、キー、値というハッシュになるというのも便利ですね。 この用法自体は知っていましたが、実際こういう使い方ができるんだなあと。 >>505 さんのコードがわかりやすかったのでこれ使っていこうと思います。 >>501 ,502,503,504,505,506さんレスどうもありがとうございました。色々勉強になりました。
509 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:08:26 ] ttp://perldoc.jp/docs/perl/5.10.0/perlretut.pod A bit of magic: executing Perl code in a regular expression の項だけど、、、 >この機能は実験的であると考えられており、予告なしに 変更されるかもしれないことを >警告しておきます。 なので勉強する必要は無いと思うよ…
510 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:24:03 ] 実験的とはいいつつ5.6.0のころからずっとある機能だから勉強しといてもいいだろ とはいえそう使うことのあるものとも思えんが
511 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:33:22 ] >>507 >ref $class これ真になる事無いだろ。 インスタンスメソッドとしても機能させたいんだったら もう一工夫必要じゃね?
512 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:38:31 ] あー、そっか。インスタンスからnew呼んだら return $singleton if $singleton; で抜けるんだな クラスからでもインスタンスからでも同じもの返して欲しいからそこだけ削除して sub new { my $class = shift; return $singleton if $singleton; return $singleton = bless {}, $class; } こうするだけでいいのか?
513 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:55:28 ] ああ、一工夫もへったくれもなかったねw スマン。
514 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:49:43 ] >>506 ど変態の例 sub hoge { $hoge = shift } sub foo { $foo = shift } $str =~ s/((?:hoge|foo)\(.*?\))/$1/eeg;
515 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 21:03:43 ] Perlのコードを配布する際ってCPANからインストールして 使用したモジュールってどのように付属すれば良いのでしょうか? それともReadmeなどにCPANからこのモジュールをインストールしてくださいと 書いておくのでしょうか
516 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:15:26 ] それとも
517 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:18:40 ] >>515 CPAN モジュールやその他のよく知られたライブラリ類は、特に事情がなければユーザに揃えてもらった方がよいでしょう。 ユーザ環境のモジュール配布元へのアクセスが制限されていたり、配布スクリプトがモジュールの特定のバージョンに依存するなどの事情がある場合は、その旨明記した上で各モジュールのライセンスが許せば同梱することもできます。 インストールスクリプト中で依存モジュールを CPAN からインストールさせることもできますが、大抵の単体配布では単に依存関係(必要なモジュールのリスト)を(できれば POD に)明記しておくだけで充分です。
518 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:12:09 ] なるほど、やはりユーザーにもある程度の技術力は求められるのですね。 ありがとう御座いました
519 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:38:42 ] $hogeの中の「\/:*?"<>|」を全て半角スペースに置き換えるのはどうすればいい?
520 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:53:38 ] >>519 $hoge =~ s,\Q\/:*?"<>|\E, ,sg;
521 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:45:04 ] >>519-520 perldoc.jp/docs/perl/5.10.0/perlop.pod#item_tr_SEARCHLIST_REPLACEMENTLIST_cds_tr_y_transliterate__c__d__s $hoge =~ tr{\\/:*?"<>|}{ };
522 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:08:47 ] 質問です。 Class::Accessor::Fastを使用して ハッシュのアクセサって作れるのでしょうか? いろいろ試してみたのですがうまく行きませんでした… ↓イメージ的にはこんな感じ package My::Class; use base qw(Class::Accessor::Fast); __PACKAGE__->mk_accessors( qw(hoge) ); package main; my %hash = ( "a" => 'aaaaa', "b" => 'bbbbb', ); my $obj = My::Class->new(); #$obj->hoge(\$hash);
523 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:52:22 ] d.hatena.ne.jp/goryugo/20090222/1235237948 ↑の問題ってまだ残っているのでしょうか? 久しぶりにMechanizeを使ったプログラムを動かしたら 同じエラーが出るようになったのですがCommon.pmの中身が変わってしまっているようで 何処を修正すれば良いのかわからないのですが.....
524 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:05:45 ] s/ で / が使えない時の第一選択って何にしてる?
525 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:40:29 ] {}
526 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:47:34 ] >>524 PATTERN か REPLACEMENT がある程度長ければ、/ の有無に関わらず {} 。 短ければ PATTERN にも REPLACEMENT にも現れない棒状の文字… | か ! か # 。
527 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 03:23:38 ] >>522 $obj->hoge(\%hash);
528 名前:PHPの神 mailto:sage [2009/04/09(木) 06:53:49 ] itpro.nikkeibp.co.jp/article/NEWS/20090408/328083/ Pelってなんだよ
529 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 07:50:22 ] > 「Pelは大規模Webサービスを支え,今も進化している。しかしそのことが広く知られていない」 確かに「Pel」は知られていないなw 冗談はともかく、日曜プログラマの自分からするとめちゃめちゃ知られてるような気がするんだ けど。「Perl技術者の雇用を増やしたい」とは言ってるけど、それでも何がしたいのかよくわから ない。まだ安定した地位を得ていないRubyとかならまだわかる。 まったくの妄想だけど、Ruby on Railsに仕事を奪われがちになってるとか? でもそれなら そっちも覚えればいいだけだしなあ。
530 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 13:47:31 ] {}なんて使えるんだ うちだと、 $str =~ s{}a{}A{}; みたいにしてもエラーになる
531 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 14:12:06 ] >>530 本気なのかネタなのか判断に苦しむなそれw
532 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 14:27:26 ] $str =~ s{a{b{; 普通に考えたらこんな感じ? 変な感じ… 家帰ったら試してみよう
533 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:05:11 ] >>532 それはNG $str =~ s}a}b}; こっちはok
534 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:07:18 ] >>530 >>532 search.cpan.org/dist/perl-5.10.0/pod/perlop.pod#Quote_and_Quote-like_Operators____________________ perldoc.jp/docs/perl/5.10.0/perlop.pod 関係無いけど perldoc.jp の和訳は目次もname属性も削ってる上に 見出しが腐ってて不便極まりないな。
535 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:30:33 ] 一般的な正解 $str =~ s{a}{A};
536 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:05:55 ] 1と9を4つとを四則演算で計算結果が10になるものを出力したいのですが、 @a1 = (1,9); @a2 = (1,9); @a3 = (1,9); @a4 = (1,9); foreach $a1 (@a1){ foreach $a2 (@a2){ foreach $a3 (@a3){ foreach $a4 (@a4){ if ($a1 + $a2 + $a3 + $a4 == 10){ print $a1.'+'.$a2.'+'.$a3.'+'.$a4."\n"; } if ($a1 + $a2 + $a3 - $a4 == 10){ print $a1.'+'.$a2.'+'.$a3.'-'.$a4."\n"; (中略) if ($a1 / $a2 / $a3 * $a4 == 10){ print $a1.'/'.$a2.'/'.$a3.'*'.$a4."\n"; } if ($a1 / $a2 / $a3 / $a4 == 10){ print $a1.'/'.$a2.'/'.$a3.'/'.$a4."\n"; }}}}} こんな感じで記述する手間がとても大変です こういう場合に少ない記述で全組み合わせを試すいい方法はありますか?
537 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:41:26 ] @a1 = (1,9); @a2 = (1,9); @a3 = (1,9); @a4 = (1,9); @op = ('+', '-', '*', '/'); foreach $a1 (@a1){ foreach $op1 (@op){ foreach $a2 (@a2){ foreach $op2 (@op){ # 中略 $fomulae = $a1.$op1.$a2.$op2.$a3.$op3.$a4; print "$fomulae \n" if (eval $fomulae == 10); }}}} こんな感じかな。
538 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:51:32 ] >>537 演算子を変数に入れておkだと初めて知りました! ありがとうございました
539 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:06:21 ] なぜ複数形
540 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:10:04 ] 誰か助けて下しア 環境がPERL5.8.* Jcode 2.6.5 PERL5.6.1 Jcode2.0から移したら 今までCGIで文字化けしなかったものが化けました。 $str = '莞ゲマン'; $hoge = Jcode->new($str, euc)->h2z->euc; print "$hoge"; 今までは 潟zゲマン と表示されていたのに、 ?ホゲマン となります。 原因を調べていたら、5.8移行は機種依存文字は無視しないで?に変換してしまうとのことで。。。 これを 潟zゲマン となるように 解決したいのですが、どなたかご教授ください。
541 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:16:20 ] すみません 他で聴くためこちらの回答は不要です 失礼しました
542 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:28:24 ] 541は540とは違います。 引き続き回答お願いします。
543 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:50:52 ] コードをeucで書いて、sjisで読んでeucに変換して処理して、 ということをよくやるけど、ローマ数字が元に戻せなくなるんだよな
544 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:06:00 ] euc-jp-msでも?
545 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:37:02 ] そんなencodeは知らんと言われる
546 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:48:06 ] ppm install Encode::EUCJPMS みたいなことをしても、見つからない
547 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:58:35 ] 5.8.xならactivestateのリポジトリにあるみたいだけど。 ppm install Encode-EUCJPMS
548 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:00:35 ] それもやったんだけどな 無いってよ
549 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:21:10 ] 普通に入ったぞ。見りゃわかるだろうが手元はwindowsな I:\> ppm i Encode-EUCJPMS ==================== Install 'Encode-EUCJPMS' version 0.07 in ActivePerl 5.8.8.817. ==================== Files found in blib\arch: installing files in blib\lib into architecture depende nt library tree Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.dll Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.exp Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.lib Installing C:\Perl\site\lib\Encode\EUCJPMS.pm Successfully installed Encode-EUCJPMS version 0.07 in ActivePerl 5.8.8.817.
550 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:25:56 ] D:\>ppm i Encode-EUCJPMS ppm i failed: Can't find any package that provide Encode-EUCJPMS なーにが違うんだろう D:\>perl -v This is perl, v5.8.8 built for MSWin32-x86-multi-thread (with 18 registered patches, see perl -V for more detail)
551 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:30:44 ] I:\> perl -v This is perl, v5.8.8 built for MSWin32-x86-multi-thread (with 25 registered patches, see perl -V for more detail) Copyright 1987-2006, Larry Wall Binary build 817 [257965] provided by ActiveState www.ActiveState.com Built Mar 20 2006 17:54:25 ppm repは?もしかしてactivestateのリポジトリ無効にしてるとか無いよな?
552 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:40:11 ] D:\>ppm rep レトトトトツトトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ ウ id ウ pkgs ウ name ウ テトトトトナトトトトトトナトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトエ ウ 1 ウ 9817 ウ ActiveState Package Repository ウ タトトトトチトトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル (1 enabled repository) 大丈夫なのか、この画面は
553 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:43:13 ] んー、ppmのバージョン違うのか?その表示は覚えが無いぞ… > ppm version PPM 3.4 > ppm rep Repositories: [1] tcool [2] ActiveState Package Repository
554 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:46:25 ] D:\>ppm version ppm 4.01 Copyright (C) 2007 ActiveState Software Inc. All rights reserved. ここがはっきり違う Binary build 822 [280952] provided by ActiveState www.ActiveState.com Built Jul 31 2007 19:34:48 ここ?
555 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:56:53 ] あー、わかった。activeperl5.8.xは確かbuild818か819ぐらいで別リポジトリになってるんだわ てことはそっちの新しいリポジトリに入ってないんだな 今ちょっと調べてきたらtrouchelle(ttp://trouchelle.com/perl/ppmrepview.pl)のリポジトリに入ってるみたいなんで、 リポジトリ追加したらいいと思う build822だからこれでリポジトリ追加して ppm rep add trouchelle trouchelle.com/ppm/ ppm i Encode-EUCJPMS で入ると思う ま、ローマ数字扱えるかどうかは確信がもてないがw
556 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:03:55 ] D:\>ppm rep add trouchelle trouchelle.com/ppm/ Downloading trouchelle packlist...done Updating trouchelle database...done Repo 2 added. D:\>ppm i Encode-EUCJPMS Downloading Encode-EUCJPMS-0.07...done Unpacking Encode-EUCJPMS-0.07...done Generating HTML for Encode-EUCJPMS-0.07...done Updating files in site area...done 7 files installed 流石は名探偵
557 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:08:39 ] でもローマ数字は駄目だった
558 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:10:42 ] と思ったら、shiftjisじゃなくてcp932にしたら上手く行った
559 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:14:55 ] サンプル #written in EUC use Encode; use Encode::EUCJPMS; $str = "つI"; print e2s($str); sub e2s() { my $str = shift; return encode('cp932', decode('euc-jp-ms', $str)); }
560 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:08:03 ] >>539 どういうことですか?