- 1 名前:nobodyさん mailto:sage [2007/09/16(日) 19:49:43 ID:???]
- Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】 質問するときは内容をよく吟味してから投稿してください。 「コマンドの意味がわかんない」とかはマニュアル見ましょう。 回答者さんは何でも屋じゃありません。 1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。 最低でも1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。 お勧めサイトは >2 以降 前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/ 過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
- 376 名前:nobodyさん mailto:sage [2007/10/15(月) 12:15:17 ID:???]
- 男は黙って正規表現一択
scrAPIは女の様な軟弱者が使う物
- 377 名前:nobodyさん mailto:sage [2007/10/15(月) 14:20:07 ID:???]
- youtubeに上げなおしてくれ。
ニコニコ垢なんかもってないし使いたくも無い。
- 378 名前:nobodyさん mailto:sage [2007/10/15(月) 21:15:14 ID:???]
- カレンダーを作りたいと思っているんですが、ライブラリはありませんか?
- 379 名前:nobodyさん mailto:sage [2007/10/15(月) 22:05:51 ID:???]
- >>378
search.cpan.org/search?m=all&q=Cal&n=100
- 380 名前:nobodyさん mailto:sage [2007/10/15(月) 23:41:31 ID:???]
- 処理の進捗状況を表示する一番よい方法は何ですか?
一定期間ごとにファイルに書き込むことしか思い付きません。
- 381 名前:nobodyさん mailto:sage [2007/10/15(月) 23:43:46 ID:???]
- >>380
それでいいんじゃねーの 一番簡単だし
- 382 名前:nobodyさん mailto:sage [2007/10/16(火) 06:05:03 ID:???]
- $| = 1;
って何かいいことあるの?
- 383 名前:nobodyさん mailto:sage [2007/10/16(火) 08:47:04 ID:???]
- 意味をわかった上で言ってるのか?
それとも意味を聞いてるのか? とりあえず「perl コマンドバッファリング」あたりでググれ。
- 384 名前:nobodyさん mailto:age [2007/10/16(火) 10:56:39 ID:???]
- 自分が使ってるサーバーがLWPが使えないようなので、socketで別サーバーのファイル内容を拾って展開させようとしたんですが、
ローカルではちゃんと動くのにサーバーにアップすると凍ってしまいます。 リストにある複数のブログのrss取得して最新のブログ3件の記事表示、みたいなのがやりたいんですが、 サーバーがLWPの許可してないと難しいですか? なにかいいやり方あったらお教えください。
- 385 名前:nobodyさん mailto:sage [2007/10/16(火) 11:11:22 ID:???]
- fpingの出力値の数字だけを抜き出すプログラムを作りたいのですが、うまくできません。
input.txtという名前に下のようなfpingの出力を入れ www.yahoo.co.jp:[0], 84 bytes, 18.1 ms (18.1 avg, 0% loss) www.yahoo.co.jp:[1], 84 bytes, 23.2 ms (20.7 avg, 0% loss) 18.1 23.2と出力したいです。 bytes,より前を切り取り、ms ( も切り取ろうとして $fping = "./input.txt"; open(A,"$fping")|| die "Can not open file"; @b = <A>; close (A); foreach $c(@b){ $c = grep(/(.*?)bytes, (\d{1,4}\.\d{1,2} ms) \(/,$c); } foreach $c(@b){ print "$c\n"; } というプログラムを作ったんですが、うまくいきません。 どこを直せばいいでしょうか?
- 386 名前:nobodyさん mailto:age [2007/10/16(火) 11:26:03 ID:???]
- >>385
$c =~ /bytes, (.*?) ms/; $c = $1; じゃだめなん?
- 387 名前:385 mailto:sage [2007/10/16(火) 12:33:21 ID:???]
- >>386
レス遅れてすいません。 できました! ありがとうございます!! 助かりました、ホントありがとうございます!!!
- 388 名前:nobodyさん mailto:sage [2007/10/16(火) 12:40:52 ID:???]
- >>385
出遅れた…。 perl -lne "print /(?<=bytes, )(.+?)(?= ms)/" input.txt
- 389 名前:nobodyさん mailto:sage [2007/10/16(火) 13:22:24 ID:???]
- >>384
どこの鯖使ってるか知らんが、LWP使えないようにしてるってことは FWでoutboundが遮断されてる可能性が高く、だとすればどうしようもない
- 390 名前:nobodyさん [2007/10/17(水) 00:29:17 ID:7VxwUF8E]
- SNSサイトにperlを使って接続って無理?
- 391 名前:nobodyさん mailto:sage [2007/10/17(水) 00:37:06 ID:???]
- 日本語でOK
- 392 名前:nobodyさん mailto:sage [2007/10/17(水) 01:05:09 ID:???]
- >>390
WWW::Mixi WWW::Myspace
- 393 名前:nobodyさん [2007/10/17(水) 08:03:38 ID:BedUMdjt]
- おはようございます。
下のような流れのcgiで 複数のクライアントから接続された場合 変数$gHogeはクライアント毎に保たれますか? それとも上書きされちゃいますか? my $gHoge = ""; #クライアントからポストされた値が入る。 〜$gHogeを扱う長めの処理が続く。
- 394 名前:nobodyさん mailto:sage [2007/10/17(水) 08:36:36 ID:???]
- >>393
実行される度にプロセスが作られるから上書きなんてされない
- 395 名前:393 mailto:sage [2007/10/17(水) 09:01:24 ID:???]
- >>394
そうですか。期待通りの結果でよかったです。 朝早くからありがとうございました。
- 396 名前:nobodyさん [2007/10/17(水) 23:05:49 ID:7VxwUF8E]
- >>392???
わからないので要望スレに逝ってきますorz
- 397 名前:nobodyさん mailto:sage [2007/10/18(木) 00:34:50 ID:???]
- >>396
ググることもできないのか
- 398 名前:nobodyさん mailto:sage [2007/10/18(木) 01:48:20 ID:???]
- モジュールがわからなくてSNSに接続しようとは・・・
- 399 名前:バターズ mailto:sage [2007/10/18(木) 22:40:14 ID:???]
- コロンが二つならんでいるのは
ダブルコロンって言うんだよ
- 400 名前:nobodyさん [2007/10/20(土) 00:37:33 ID:Ja84SJeF]
- Location ではtargetが指定できませんが、呼び出したときの
属性は生きるってどこかに書いてありました どういうことでしょう ssiのhtmlファイルの中に書いた、iframeのCGIまたは#exec cgiで クッキー認証できなかったら全画面を再認証画面に飛ばしたいのですが、 やはり無理でしょうか?
- 401 名前:nobodyさん [2007/10/20(土) 05:18:19 ID:VLTga6QI]
- print <<EOM;
<a href="hoge.html">hoge</a> EOM と、 print "<a href=\"hoge.html\">hoge</a>\n"; ではどちらの方が実行速度が速いですか?
- 402 名前:nobodyさん mailto:sage [2007/10/20(土) 06:50:46 ID:???]
- >>401
ほぼ同じ。 boobar.hp.infoseek.co.jp/bench/print.txt
- 403 名前:nobodyさん [2007/10/20(土) 07:40:43 ID:VLTga6QI]
- >>402さん、ありがとうございます。
大変参考になりました。
- 404 名前:nobodyさん [2007/10/20(土) 07:47:37 ID:x+Q9ulv4]
- おはようございます。
以下のスクリプトについて質問です。 outフォルダ内の.txtファイル全てに対して ある作業をするというスクリプトなんですが、 ファイルオープンのところでそんなファイルはないから 開けないというエラーが出力されます。 例:hoge.txtがある場合 OPEN ./out/hoge.txt file: No such file or directory at check line 22. どこが間違ってるか教えてください。お願いします。 OSはWindowsXPです。 my @directories_to_search = ('./out/'); #対象のフォルダ find(\&wanted, @directories_to_search); sub wanted{ my $filePath = $File::Find::name; my $find = index( $filePath, ".txt" ); #.txtを対象 unless ($find >= 0) { return 1; } open FH_READ, "<$filePath" or die "OPEN $filePath file: $!"; #ある作業をする。 close FH_READ; }
- 405 名前:nobodyさん mailto:sage [2007/10/20(土) 08:21:11 ID:???]
- >>404
22行目ってホントにopen文の所か?
- 406 名前:404 mailto:sage [2007/10/20(土) 08:33:09 ID:???]
- >>405
え?open文のor dieのエラーメッセージが出力されているから open文でエラーが発生していると思うんですが・・・
- 407 名前:nobodyさん mailto:sage [2007/10/20(土) 10:42:05 ID:???]
- 読んで字の如しとしか。
まさかmod_perlじゃないよな?
- 408 名前:nobodyさん mailto:sage [2007/10/20(土) 10:55:56 ID:???]
- >>404
openに渡すのは「$filePath」じゃなくて「$_」 File::Findの解説ちゃんと読め
- 409 名前:半角全角が混在する行が一定の文字数を超えたら折り返すようにしたい [2007/10/20(土) 14:21:49 ID:g/E6yd0f]
- メールフォームを作っています。同マシン上のsendmailを使って送るものです。
送信するメールの本文において、半角全角が混在する行の文字数を数え、 一定の文字数(例えば半角72文字、全角36文字)を超えた行だけを 強制的に折り返したいと考えています。 どのようにするのがよいでしょうか? lengthはバイト数を返す関数なので、 全角文字の真ん中で折り返されると困ることになると考えてます。 もしかすると、長い行はsendmail側が自動で折り返してくれたりするのでしょうか? それとも、何かほかの関数で簡単に数えたりできるのでしょうか? なお、カスタマイズの自由度を考えて自作しているので、 「どこそこのメールフォームを使え」というのは勘弁してください。 以上、よろしくお願いします。
- 410 名前:nobodyさん [2007/10/20(土) 14:28:07 ID:o1wAy6B9]
- eval ($hoge); の実行した値を変数に入れるにはどうしたらいいでしょうか?
$@ だと、evalでのエラーの値が入る でも、実行値は...? お願いします。
- 411 名前:nobodyさん mailto:sage [2007/10/20(土) 14:37:23 ID:???]
- >>410
$result = eval($hoge); じゃダメなん?($resultに実行結果、$@にエラーメッセージ) 参考 ttp://www.tohoho-web.com/wwwperl2.htm#eval
- 412 名前:nobodyさん [2007/10/20(土) 14:55:48 ID:o1wAy6B9]
- >>411 その通り!ありがとう。
短い$hogeだと関数が成功した1しか返さないことがあるようでアレ違うわと思っていました。 >>409 ちょっと離れるので投げっぱなしになってしまいそうだけど 解答してくれる人が現れる間に考えていました use utf8; use Encode; $str = ' eval ($hoge); の実行した値を変数に入れるにはどうしたらいいでしょうか? $@ だと、evalでのエラーの値が入る でも、実行値は...? お願いします。 '; @stream = split(/\n/,$str); #最初に渡された文字列を 改行 を区切りとして @stream に配列として読み込んだ map{ s{(.......)}{$1\n}g } @stream; #”8文字”単位で改行を入れてる map{print encode(sjis,$_)}@stream; #各行を出力するときにsjisに変換してる とか、なかんじでどうよ? ただし1バイト文字の扱いがなんか変。 *たぶんutf8でけつまずいてるかんじ。
- 413 名前:nobodyさん mailto:sage [2007/10/20(土) 16:08:12 ID:???]
- >>409
jcode.plかJcode.pmにjfoldってなかったっけ?
- 414 名前:409 mailto:sage [2007/10/20(土) 17:45:16 ID:???]
- >>413
これです。こういう機能がほしかったんです。 jcode.plにはありませんでしたが、Jcode.pmにはありました。 これまで使っていたのがjcode.plだったのでが、 MIMEヘッダの機能も強化されているようなので、Jcode.pmに乗り換えようと思います。 どうもありがとうございました。
- 415 名前:nobodyさん mailto:sage [2007/10/20(土) 18:24:36 ID:???]
- いいかげんにEncode使い方覚えろよ
- 416 名前:nobodyさん mailto:sage [2007/10/20(土) 19:12:39 ID:???]
- >>415
じゃ、Encode.pmを使って折り返す方法を書いてあげれば?
- 417 名前:nobodyさん mailto:sage [2007/10/20(土) 19:44:36 ID:???]
- Encode::decodeしてlengthでカウントしてみろよ
- 418 名前:nobodyさん mailto:sage [2007/10/20(土) 20:12:44 ID:???]
- 文字コードわかってんなら正規表現で簡単にできることだろ
- 419 名前:nobodyさん mailto:sage [2007/10/23(火) 05:26:38 ID:???]
- 全部正規表現でやるのは重そうだな。
- 420 名前:nobodyさん mailto:sage [2007/10/23(火) 14:21:34 ID:???]
- 正規表現で解決するならEncode要らんがな。
- 421 名前:nobodyさん mailto:sage [2007/10/23(火) 15:27:18 ID:???]
- Perlのテキスト処理で質問させてください。
UTF8な日本語テキストの半角カナを全角にしたいと思ってEncode::JP::H2Zを使おうと思いました。 しかし、一部の文字(〜など)がEUCに変換する段階で?に変換されてしまい、困ってしまいました。 とりあえず、コードポイントにフォールバックできることがわかったので、 以下のように書いてその場をしのぎましたが、コードポイントを検索して文字に置換するという 作業が入ってしまい(しかも無駄に複雑)、どうもしっくりきません。 もっと簡単にする方法はありますか? $text = encode("eucjp", $text, Encode::FB_PERLQQ); # EUCに変換 Encode::JP::H2Z::h2z(\$text); # 全角変換 $text = decode("eucjp", $text); $text =~ s/\\x\{([0-9A-Fa-f]+)\}/pack("U*", hex($1))/eg; # コードポイントを文字に
- 422 名前:nobodyさん mailto:sage [2007/10/23(火) 17:42:25 ID:???]
- >>421
#!/usr/local/bin/perl -w use strict; use Encode qw(from_to); use Encode::JP::H2Z; my $text = 'このファイルはUTF-8で〜半角カナ混じりの文字列'; from_to($text, utf8 => 'cp932'); from_to($text, shiftjis => 'euc-jp'); Encode::JP::H2Z::h2z(\$text); print $text; __END__ 別解。 use Unicode::Japanese qw(unijp); print unijp($text)->h2zKana->euc;
- 423 名前:421 mailto:sage [2007/10/23(火) 20:32:44 ID:???]
- >>422
ありがとうございます。その変換法で化けなくなりました。 後学のためお聞きしますが、Encodeではutf8を直接EUCにマップできないのでしょうか。 SJISを経由するのはわかるのですが、cp932をshiftjisに読み替えるなど、 トリッキーなことをやっていますね。 機種依存文字(@など)がある場合もそうですが、utf8とEUCの変換法は どうもよくわからないです。 機種依存文字とか、どうやってEUCに変換するんでしょうか
- 424 名前:nobodyさん mailto:sage [2007/10/23(火) 22:43:56 ID:???]
- 「よくわからない」のは、EUC-JPとCP51932の関係じゃないのかな。
ttp://search.cpan.org/dist/Encode-EUCJPMS/
- 425 名前:nobodyさん mailto:sage [2007/10/24(水) 01:04:04 ID:???]
- 暗号化関連の質問です
メールフォームを使っててブラウザとサーバの間はSSLで暗号化してます でもサーバからsendmailで送信するメールも暗号化してないと意味ないですよね? Perlでどうやってやってます?S/MIMEかPGPが使えるの?(´・ω・`)
- 426 名前:nobodyさん mailto:sage [2007/10/24(水) 01:05:27 ID:???]
- そもそもメールを飛ばさないという選択肢を検討すべきではないか
- 427 名前:421 mailto:sage [2007/10/24(水) 02:01:47 ID:???]
- >>424
なるほど、ぐぐってみてわかりました。 EncodeーEUCJPMSでcp51932も使えるようになるんですね。 標準のEncodeになんで実装しないんだろ、これ。
- 428 名前:nobodyさん mailto:sage [2007/10/24(水) 06:10:09 ID:???]
- >>425
search.cpan.org/search?m=all&q=PGP&n=100 search.cpan.org/search?m=all&q=S%2FMIME&n=100 求められる安全度、対象ユーザのITリテラシ、かけられるコスト 等を検討すると、暗号化メールの使えるシチュエーションは かなり限られてそうだ。金融機関やNSPだと大抵郵送だな。
- 429 名前:nobodyさん mailto:sage [2007/10/25(木) 16:41:10 ID:???]
- スペースは or に変換するが、クォートにかこまれたスペースは変換しない。
これの実装がうまくいきません。 例えば tenis ball は tenis or ball に変換するけど 'tenis ball' はそのままっていうのはなんとか出来たんですが、 'tenis ball' 'base ball' のときは 'tenis ball' or 'base ball' にするのがどうしても出来ません。 orを入れたい場所もクォートに囲まれてると判断されてしまうのです。 どなたか助けてください。
- 430 名前:nobodyさん mailto:sage [2007/10/25(木) 17:03:22 ID:???]
- >>429
my @list = ( q{tenis ball}, q{'tenis ball'}, q{'tenis ball' 'base ball'}, ) ; for my $line ( @list ){ print join ' or ', map{ /'/ ? $_ : split /\s+/, $_ } split /\s+(?=')/, $line ; print qq{\n} ; }
- 431 名前:nobodyさん mailto:sage [2007/10/26(金) 05:03:54 ID:???]
- foreach(@list){
my @token = m/('[\w\s]*'|\w+)(?:\s+|$)/g; print join (' or ', @token), "\n"; }
- 432 名前:429 mailto:sage [2007/10/26(金) 15:02:18 ID:???]
- >>430
すみません、できるだけワードは固定してない方がいいのですが・・・うまく動きませんでした。 >>431 おぉ、なんかうまく動きそうです。 でも、クォートの部分を除外して配列に納めたいのですが、どうしたらいいのでしょうか?
- 433 名前:nobodyさん mailto:sage [2007/10/26(金) 23:17:20 ID:???]
- >>432
430は全角文字(スペースも含め)を半角に変換してもダメか? それと「クォートの部分を除外」って意味が分らん。単に クォートを削除したいだけなら、そのぐらいは自力で考えてみたら?
- 434 名前:nobodyさん mailto:sage [2007/10/27(土) 10:01:02 ID:???]
- Encode::JP::H2Z
ってなんでeucjpの糞使用なの? ユニコードのまま渡せて処理出来ればいいのに。
- 435 名前:nobodyさん mailto:sage [2007/10/27(土) 11:34:06 ID:???]
- >434
そういうことはdankogaiに直接文句つけて来い
- 436 名前:nobodyさん mailto:sage [2007/10/27(土) 13:36:03 ID:???]
- >434
じゃあお前さんがそういうの作れば?
- 437 名前:nobodyさん mailto:sage [2007/10/27(土) 16:43:19 ID:???]
- >>434
Jcode::H2Z (Jcode.pm のサブモジュール) そのままだから。
- 438 名前:nobodyさん mailto:sage [2007/10/27(土) 18:53:28 ID:???]
- utf8もページからフォームを入力して送信させると、
「〜」の文字だけがなぜか正常に送信されないのですが、なぜでしょうか?
- 439 名前:nobodyさん [2007/10/27(土) 22:19:08 ID:jIrqvOa/]
- return +{};
という記述の意味を教えて下さい 空ハッシュを返すという事でしょうか?
- 440 名前:nobodyさん mailto:sage [2007/10/27(土) 22:50:14 ID:???]
- >>438
何を以て「正常に送信されない」と判断したのか。 ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5 euc.jp/i18n/ucsnote.ja.html www.asahi-net.or.jp/~hc3j-tkg/unicode/ >>439 perldoc.jp/docs/perl/5.8.8/perlop.pod > 単項演算子の "+" は、たとえ文字列に対して用いられた場合にも、 > 何もしません。関数名に続けて括弧付きの式を書く場合に、関数の > 引数リストと解釈されないようにするために用いることができます。
- 441 名前:nobodyさん [2007/10/27(土) 23:21:31 ID:jIrqvOa/]
- >>440
ありがとうございます、単項演算子についてはわかったのですが とあるCPANモジュールのコードで return +{} unless $data; というコードがあったのですがこれを return {} unless $data; と書かずに単項演算子の+をつけるのは 何か意図があるのでしょうか 戻り値自体はどちらでも同じような気がするのですが、、
- 442 名前:nobodyさん mailto:sage [2007/10/28(日) 00:49:00 ID:???]
- ブロックとして解釈される場合があるんじゃね
- 443 名前:nobodyさん mailto:sage [2007/10/28(日) 04:52:46 ID:???]
- +{ } :無名ハッシュでコンパイル
{; } :コードブロックでコンパイル
- 444 名前:nobodyさん mailto:sage [2007/10/28(日) 08:38:20 ID:???]
- www.nicovideo.jp/watch/sm1024453
Perlで予約語プログラミング
- 445 名前:nobodyさん mailto:sage [2007/10/28(日) 08:48:47 ID:???]
- www.nicovideo.jp/watch/sm1237738
Perl Programming: Web::Scraperモジュールの利用 ↑これ何やってるの?
- 446 名前:nobodyさん mailto:sage [2007/10/28(日) 08:54:29 ID:???]
- www.nicovideo.jp/watch/sm1233406
Perl Catalyst Programming (入門編) ↑これも何をやっているのか、 さっぱりわからんよ
- 447 名前:nobodyさん mailto:sage [2007/10/28(日) 09:22:22 ID:???]
- まぁプログラミングを動画で見てもわからんよなw
- 448 名前:nobodyさん mailto:sage [2007/10/28(日) 09:30:40 ID:???]
- そうか?
この動画だけは「何をやろうとしてるか」だけは伝わるぞ ttp://www.youtube.com/watch?v=KyLqUf4cdwc
- 449 名前:nobodyさん mailto:sage [2007/10/28(日) 11:24:36 ID:???]
- >>448
Aho da...orz
- 450 名前:nobodyさん mailto:sage [2007/10/29(月) 02:42:49 ID:???]
- >>446 にある動画はなんかおかしいと思う。
- 451 名前:nobodyさん mailto:sage [2007/10/29(月) 11:17:19 ID:???]
- 質問させてください。
指定した文字が何回続いたかを取得したいのですがどうしたらいいですか? 例)この場合指定した文字は1です。 $a = '1111222'; $b = '1111136'; $aは4 $bは5 よろしくお願いします。
- 452 名前:nobodyさん mailto:sage [2007/10/29(月) 11:56:14 ID:???]
- $a='1111222';$i='1';($r)=($a=~m/($i{2,})/);print length $r
全角はシラネ
- 453 名前:nobodyさん mailto:sage [2007/10/29(月) 11:59:30 ID:???]
- $a = '1111222';
$c= 1; $n= length(($a=~/((?:\Q$c\E)+)/)[0])/length($c);
- 454 名前:nobodyさん mailto:sage [2007/10/29(月) 12:31:05 ID:???]
- perlは色んなやり方があって面白いね
$a = '111111222'; $n = '1'; $count = length(($a =~ /($n+)/)[0]);
- 455 名前:nobodyさん mailto:sage [2007/10/29(月) 13:04:18 ID:???]
- >>451
$test_str = '111234111111'; $char = '1'; こういう場合は後半気にせず、まず見つけた連続の 3 でいいの?それとも、より長い連続の 6? 「はい、6 が得られるようにしたいんです」だと上に回答を書いた皆さんが優しくキレるかも。 あと、例なんだろうけど $a や $b は地雷踏むことがあるから気をつけてね。
- 456 名前:nobodyさん mailto:sage [2007/10/29(月) 13:25:31 ID:???]
- use strict;
use warnings; test('1111222' => 1 ); test('1111222' => 2 ); test('111122211' => 1 ); test('111122211' => 1 , 1); test('1111136' => 1 ); sub test {printf "%s:%s:%s\n",$_[0],$_[1],_test(@_)} sub _test { local($a,$b); (sort {$b<=>$a} map {length($_)} ($_[0] =~ m{($_[1]+)}g) )[ $_[2] ? -1 : 0 ]; }
- 457 名前:nobodyさん mailto:sage [2007/10/29(月) 17:04:12 ID:???]
- my $i = '1' ;
print +( length ) . qq{\n} for split /[^$i]+/ ,$a ;
- 458 名前:456 mailto:sage [2007/10/29(月) 19:24:03 ID:???]
- 見直したらgdgdだったので修正しとく
sub _test { ( sort map length,$_[0] =~ /(${_[1]}{2,})/g )[$_[2] ? 0 : -1] }
- 459 名前:nobodyさん mailto:sage [2007/10/30(火) 23:38:44 ID:???]
- 一つのファイルで処理がたくさん書いてあって分岐させる時に、
例えば $mode = $cgi->param('mode'); というデータを受け取って、処理の場合わけをする場合どういう書き方がエレガントなんでしょうか? 現状は if ($mode eq 'post') { &post} elsif ($mode eq 'edit') { &edit;} elsif ($mode eq 'delete') { &delete} else { &error} こんな感じなのですが、それは初心者の書き方だって馬鹿にされました。 悔しいのでもっと効率的な方法があったら教えてください。
- 460 名前:JAPU ◆lVJAPUTeX. mailto:sage [2007/10/30(火) 23:52:20 ID:???]
- >>459
エレガントかは分からないけど、分岐がある程度多い場合はこんな書き方だとすっきり書けるかと。 %actions = (post => \&post, edit => \&edit, delete => \&delete); if(exists $actions{$mode}) { $actions{$mode}->(); } else { error(); } 数個程度なら if で分岐されちゃってもいいと思いますし、実際そうしています。
- 461 名前:nobodyさん mailto:sage [2007/10/30(火) 23:58:03 ID:???]
- >>459
それでいいんじゃね? 各サブルーチンに戻り値があるなら「三項演算子」って手もあるし、 以下の様なやり方もあるけど、普通に書いてメンテ出来るものならば バカにされても放置しとけば? my %hash = ( post => sub { 1 } , # &post の内容を書く edit => sub { 2 }, # &edit の内容 delete => sub { 3 }, # &delete の内容 ) ; print $hash{'edit'}->() || q{error} ; #q{error} には&error あたりを、、、 ソース全体を見たら綺麗な書き方があるかもしれんが、 それに関しては情報不足。
- 462 名前:nobodyさん mailto:sage [2007/10/30(火) 23:59:04 ID:???]
- ああ、丸かぶりだorz...
- 463 名前:nobodyさん mailto:sage [2007/10/31(水) 00:10:35 ID:???]
- せめて、CGI::Applicationくらい使っとけって話なんじゃ。
if文分岐も分かりやすいと思うが、へたに小細工するとますますへたっぴに見える。
- 464 名前:nobodyさん mailto:sage [2007/10/31(水) 12:11:23 ID:???]
- 三項演算子ってタマに見かけるけど読みづらいんだよな。
使いたくない書き方No1かも。
- 465 名前:nobodyさん mailto:sage [2007/10/31(水) 13:29:29 ID:???]
- $expr1 ? $expr2
: $expr3 ? $expr4 : $expr5 ? $expr6 : $expr7 ; 書き方か頭が悪いんだろ
- 466 名前:至急 mailto:cgisupport@xxne.jp [2007/10/31(水) 15:17:23 ID:???]
- CGIを自宅出張でサポートしてくれる方募集します。
CGIに詳しく都内に来れる方であれば可能 一日日払い即金で払います。 詳細はメール下さい。
- 467 名前:nobodyさん mailto:sage [2007/10/31(水) 15:47:41 ID:???]
- >>459
エレガントかしらないけどこんなパッケージ作ってる。 (不要箇所削ったのでそのまま動くか不明) package Local::Base; use strict; use warnings; our $DEBUG = 0; sub class {ref$_[0]||$_[0]||__PACKAGE__} sub new {(bless {} => class( shift() ))->init(@_)} sub mode :method {shift->param('mode',@_)} sub method_name :method {shift->{method_name}->{ shift() }} sub default_method :method {die('不正なmodeを受け取りました')} sub init :method { my $self = shift; my %param = @_; $self->{method_name} = $param{method_name} || {}; return $self->run_method( $self->mode , @_ ); } sub run_method :method { my $self = shift; my $method = $self->method_name( shift ); $method = 'default_method' unless $method && $self->can( $method ); return $self->$method(@_); } 1;
- 468 名前:nobodyさん mailto:sage [2007/10/31(水) 17:36:51 ID:???]
- >>467
外部からinitとか呼ばれちゃわない?
- 469 名前:nobodyさん mailto:sage [2007/10/31(水) 19:51:49 ID:???]
- >>467 method_nameチェックしてるから大丈夫
使い方も書いたつもりだったんだけど書けてなかった。 #!/usr/bin/perl use strict; use warnings; use base qw(Local::Base); my $r = eval{ __PACKAGE__->new( method_name => { edit => 'edit', post => 'post' } ) } || $@; print CGI->header,$r,"\n" unless ref $r; ###################################################################### # editの動作を定義 sub edit :method { my $self = shift; print $self->header; print "EDITモード"; return $self; } 1;
- 470 名前:nobodyさん mailto:sage [2007/10/31(水) 20:11:48 ID:???]
- sub edit :method {
この :method って何の意味だっけ perlsub見ても載ってないや 変数にも付けれた気がしたが
- 471 名前:nobodyさん mailto:sage [2007/10/31(水) 21:09:19 ID:???]
- perlsub に載ってるし、perldoc attributesすれば詳細分る(perl5.8.1)。
perl attributes でググれば日本語のサイトも沢山出る。 変数に付けられるのは 5.8系
- 472 名前:nobodyさん mailto:sage [2007/11/01(木) 01:06:18 ID:???]
- 実際、CGI::Applicationとか使うと効率的になるの?
自分でゴチャゴチャ作るよりも。使ってる人いる?
- 473 名前:nobodyさん mailto:sage [2007/11/01(木) 02:26:10 ID:???]
- CGI.pmで書くには複雑だけど、Catalystとかのフレームワーク持ち出すまでもないときには使える
- 474 名前:nobodyさん mailto:sage [2007/11/01(木) 10:48:57 ID:???]
- > CGI.pmで書くには複雑だけど、Catalystとかのフレームワーク持ち出すまでもないときには使える
CGI::Application もフレームワークじゃないの?
- 475 名前:nobodyさん mailto:sage [2007/11/01(木) 17:27:41 ID:???]
- >>470
:methodは組み込みのattribute Attribute::Handlers使うと自作のattributeも作れる。 …がいつ仕様が定まってなくて変更があるかもってどっかで読んだ気がする。 >>474 ・自分しかいじらない ・少人数で知識の共有が容易 ・マニュアルが整っている のどれかなら自作のフレームワークの方が慣れてるだろうし開発効率いいんじゃないかな? フレームワーク自体のメンテナンスが(出来る|しなきゃいけない)のはデメリットか? 既製のフレームワーク使うのは ・他の人と知識の共有しやすい ・ドキュメントがある/(第3者も使ってるので)ノウハウが検索しやすい ・フレームワーク自身のメンテナンスを(あまり)しなくていい ってとこかな?
- 476 名前:nobodyさん mailto:sage [2007/11/01(木) 18:07:59 ID:???]
- >>475
???
|

|