[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 08/25 20:07 / Filesize : 271 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Perlコーディング初心者質問スレ Part 56



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/

371 名前:nobodyさん mailto:sage [2007/10/15(月) 00:43:20 ID:???]
>>369
ぐぐればトップに出てくるだろうに

372 名前:nobodyさん mailto:sage [2007/10/15(月) 00:44:21 ID:???]
ごめん、371は勘違い

373 名前:nobodyさん mailto:sage [2007/10/15(月) 01:06:24 ID:???]
nikonikoにもScraperネタある。
www.nicovideo.jp/watch/sm1237738


374 名前:nobodyさん mailto:sage [2007/10/15(月) 03:46:48 ID:???]
Web::Scraper が重いんだけど、どうにかならないの?

375 名前:nobodyさん mailto:sage [2007/10/15(月) 05:35:56 ID:???]
不満は作者に直接言う
改善案を出す
パッチ送る

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系






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<271KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef