Perlについての質問箱 32箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/08/13(月) 18:01:530159デフォルトの名無しさん
2007/08/20(月) 14:20:15えーなにおまえ。
社長からメールくるとき
いっつもそんな文面なの?
0160デフォルトの名無しさん
2007/08/20(月) 14:32:03>よく読んで
0161デフォルトの名無しさん
2007/08/20(月) 15:52:23やさしい事だねぇ。
質問(>>147=152)で別の質問(>>23,28,50,前スレ最後)を思い出しさなかった?
ボロクソ言うにしろ、Webprog板のスレ 741-747程度言って通じるかどうかって相手だろ、これ。
0162デフォルトの名無しさん
2007/08/20(月) 16:18:270163デフォルトの名無しさん
2007/08/20(月) 17:07:45(1)
1つの画像ファイルから、形式やサイズ、フィルタのかけ方が異なる複数のファイルを出力したいと考えています。
この場合、Read() 〜 編集 〜 Write() のセットを、出力したい回数だけ繰り返すしか方法は無いでしょうか?
他はともかく、Read()あたりを省略する方法があってもおかしくなさそうなので。
(2)
JPEG画像を生成しようとしてます。
特定のファイルサイズ以内に収まるように生成したいのですが、PerlMagick単体で可能なのかどうか怪しいところです。
これを解決する方法、サイズ予測モジュールなどがあればお願いします。
0164126
2007/08/20(月) 17:10:06真面目な回答ありがとうございます。助かります。
>>121のようなふざけた返答しかないから、困ってました。
しかしPerlはむずかしいですね。なかなかおぼえられません。
0165デフォルトの名無しさん
2007/08/20(月) 17:16:570166デフォルトの名無しさん
2007/08/20(月) 17:57:48(1) 任意のタイミングで Clone 使うのが楽だと思う。
(2) 実際にファイルに書き出して、サイズが大きければ品質落としてやりなおしでよくね?
0167デフォルトの名無しさん
2007/08/20(月) 20:02:47> しかしPerlはむずかしいですね。なかなかおぼえられません。
いや、簡単だよ。
0168163
2007/08/20(月) 21:50:54(1)
ありがとう。試してみる。
(2)
やっぱそれしか無いのかなー。
上限ギリギリまで画質を上げたいとか考えると、結構な時間的コストがかかりそう。
0169デフォルトの名無しさん
2007/08/20(月) 22:25:15の英語移植をやってるみたいだが、すでに何年も前に移植されてる。
http://manuke.com/static/view00000296.html
>ちなみに、私は本家 SOLD OUT の英語バージョンを仲間と作って公開したのだが、
>向こうの人たちはそんなに集まらなかった
だから、もうヤメロ。
ココに書き込むな。
開発者向けBBSを見ても、
http://mutoys.com/cgi-bin/bbs-so/ebbs.html
自己中のイタイ書き込みが多い。
0170デフォルトの名無しさん
2007/08/21(火) 01:41:52よくやった!
あなたをわが社の情報収集担当最高責任者に
任命する!
ストックオプションはどれだけ欲しいですか?
0171デフォルトの名無しさん
2007/08/21(火) 06:08:17については自己解決した。
カウントの数字は出ていたんだが、
前の文字列にくっついていたんで
見えなかっただけだった。
0172デフォルトの名無しさん
2007/08/21(火) 06:57:15「忘れることのできない病気」
な人たちであることはわかっております
「おれ達の頭の中から出て行って欲しい」
と思っているでしょうが、出て行ってあげません。
一生あなたがたの頭の中に住み着くつもりですので
あきらめてください。
私を出て行かせる方法はありません。
0173デフォルトの名無しさん
2007/08/21(火) 08:43:05偽者が出るかもしれないのでコテを付けた方が良いと思いますよ
0174デフォルトの名無しさん
2007/08/21(火) 12:44:55今日も粘着させて頂きますので
宜しくお願いしますね
0175デフォルトの名無しさん
2007/08/21(火) 22:59:59ローカルではエラーが出なかったのですが、
実環境ですと特定の条件下でエラーが出てしまいます。
以下のコードはエラーが出ないのですが、
my $output = spacesLineDelt($tmpl->output);
textOut($path, $output)
以下のコードだとエラーが出てしまいます。
textOut($path, spacesLineDelt($tmpl->output));
全く原因がわからないのですが、
どなたかお心当たりがある方教えていただけると幸いです。
なお、実環境のPerlのVerは5.00503で、
色々制限が掛かっているのですが詳細が分かりません。
0176デフォルトの名無しさん
2007/08/21(火) 23:01:460177デフォルトの名無しさん
2007/08/21(火) 23:14:58WebProg向きのような気がする。
0178175
2007/08/21(火) 23:16:02エラーなんですが、telnetが繋げずfatalstobrowserを使っても
なぜかこのエラーだけサーバが500エラーを返してきて分かりませんでした;
0179175
2007/08/22(水) 03:23:37お騒がせしました。
0180デフォルトの名無しさん
2007/08/22(水) 13:49:38継承されたクラスをどうやって扱ったらよいか迷っています。
今悩んでいるのは、複数のクラスを継承するクラスで生成したオブジェクトにおいて
呼び出したいメソッド名がクラス間で重複するとき、
クラスメソッドを呼び分けるにはどうすればよいかということです。
単純には呼び出したいクラスでメソッド名を完全修飾すればと考えたのですが、
重複メソッドが多いとこの方法で呼び分けるのはとてもわかりにくくなります。
それにメソッドの中にメソッド呼び出しがあるとまずいことになります。
そもそもメソッド名が重複するような継承はだめなのでしょうか。
ひとつご教授ください。
0181デフォルトの名無しさん
2007/08/22(水) 14:12:58ダメとは言わんけど
「自分が何をやっているか」をきちんと把握できてないと破綻する
そういうことには上級者になるまで手を出さない方がいいんじゃないかと
0182デフォルトの名無しさん
2007/08/22(水) 14:22:120183デフォルトの名無しさん
2007/08/22(水) 14:28:540184デフォルトの名無しさん
2007/08/22(水) 14:58:590185180
2007/08/22(水) 15:17:30オブジェクトを目的メソッドの所属クラスにブレスし直して、
メソッド呼出し後、元のクラスに再々ブレスし直すというものです。
コードに書くとこんな感じなります。
$curr_class = ref $object;
bless $object, 'FarInheritClass';
$object->dup_method;
bless $object, $curr_class;
対症療法としてはこれでいいですが、普通は多重継承でメソッドが重なる場合
どういう対策をしているんでしょうか。
クラス別にハンドルを生成するメソッドを用意するとかですか?
一般的な手法が知りたいです。
多重継承そのものを否定している方もいらっしゃるようですが・・・
0186180
2007/08/22(水) 15:20:57以下の例では、Aで生成したオブジェクトを使ってfというメソッドを呼び出していますが、
素の状態ではB、D、Cの順に探索するのでDのメソッドが呼び出されます。
C::で修飾してもfの中に内部メソッドの呼び出しがあるので、意図とは反して
Dの_pメソッドが呼び出されてしまいます。
これを正しく呼び分けられるようにしたいというのが質問の意図です。
package A; @ISA = qw(B C);
sub new { bless {} }
package B; @ISA = 'D';
package C; @ISA = 'D';
sub f { $_[0]->_p }
sub _p { print "I like C.n" }
package D;
sub f { $_[0]->_p }
sub _p { print "I like D.\n" }
###
package main;
$o = A->new();
$o->f; # I like D
$o->C::f; # I like D (not C)
0187デフォルトの名無しさん
2007/08/22(水) 16:27:430文字目から3文字分(abc) 4文字目から4文字分(abcd)といった情報を先に作っていて
@position = (0,4);
@substr_len = (3,4);
以下のようにsubstrを使って取り出してsortしていたのですが遅いです。(substrの部分が)
なので
@text=(a,b,c,_,a,b,c,d)と@position と @substr_len を使って基数ソートのような方法でソートし、
(0,3,4,4)のように数値情報だけ得たいと思うのですがコードの書き方がわかりません。
どうすれば良いでしょうか、よろしくお願いします。
while($j < @position)
{
$p = $position[$j];
$len = $substr_len[$p]
$word = substr($text, $p, $len);
push @a_word, $word;
$j++;
}
@a_word = sort @a_word;
0188デフォルトの名無しさん
2007/08/22(水) 17:19:14で、結局何がしたいんだ?
アンダースコアで単語を切り分けてアルファベット順に並べ替えたいならアプローチが間違ってる。
0189デフォルトの名無しさん
2007/08/22(水) 17:58:41A を使うに際し A の内部で C が使われている事を
意識しなければいけない状態はカプセル化に失敗しているわけだけど、
それはいいの?
駱駝本や黒豹本だと無闇に継承(is-a)を使わず
合成(has-a、use-a)も考えるよう勧められてるよ。
0190デフォルトの名無しさん
2007/08/22(水) 18:04:43パターンだな
別名つけるのがありがちだけど完璧で美しい対処法なんて無いだろ
だから多重継承は強力でありながら忌み嫌われるんだよ
0191デフォルトの名無しさん
2007/08/22(水) 23:54:510192デフォルトの名無しさん
2007/08/23(木) 10:24:04open FP,'<:encoding(shiftjis)', 'input.txt' or die;
$Zspace = "/xE3/x80/x80"; # Zenkaku space on EUC-JP
if($line=~/$Zspace/){
print "detected";
}
というスクリプトを書いてみましたが
これを実行してもマッチングに失敗します。
何が悪いのか分かるかたいらっしゃいませんか?
0193デフォルトの名無しさん
2007/08/23(木) 12:20:11フォームからCGIにアドレスを送り、次のような感じでリンクの表示したいのですが、
print "<a href=\"$a\" target=\"_parent\">詳細はこちら>></a>";
フォームから送ったアドレスの$_からがうまく渡せません。下のアドレス、
http://xxx.com/app/search.cgi?_mode=mode_detail&_type=rl&_object_id=0001
を、ファームから送っても、
http://xxx.com/app/search.cgi?_mode=mode_detail
でリンクされてしまいます。
&_が原因だろうというのは分かるのですが、どう対処すればいいのか分かりません。
ものすごく初心者な質問だと思いますが、よろしくお願いします。
0194デフォルトの名無しさん
2007/08/23(木) 12:25:500195デフォルトの名無しさん
2007/08/23(木) 12:31:11Javaスクリプトを無効にしてみたら?
0196デフォルトの名無しさん
2007/08/23(木) 12:39:33突っ込みどころ満載ですね
\xE3\x80\x80にマッチしないのはutf8フラグ付いてるから
逆に言えばutf8フラグ付いてたら\sで全角スペースにマッチするにょ
0197デフォルトの名無しさん
2007/08/23(木) 12:47:30俺はここに飛ばされるんだが。。。
http://xxx.com/
そのアドレス先に行ってソース嫁、読めばなぜ飛べないのかわかる
0198デフォルトの名無しさん
2007/08/23(木) 12:58:10インターネットオプションから試しましたがダメでした。Javaスクリプトを無効に
する方法って他にありますか?
>>197
ttp://xxx.com/ のxxxは仮のURLとして書いたものです。申し訳ありません。
0199デフォルトの名無しさん
2007/08/23(木) 13:54:13@form=split (/&/,$input);
の&部分が、送られたアドレスの&部分とごっちゃになって(表現が変ですが)、
ttp://××.com/app/search.cgi?_mode=mode_detail&_type=rl&_object_id=0001
を、&で分解して
ttp://××.com/app/search.cgi?_mode=mode_detail
_type=rl
_object_id=0001
に分けてしまうのが原因のように思えてきました。
対処方法が分かればお願いいたします。また、説明不足な感じになって、
アドバイスしていただいた方、申し訳ありませんでした。
@form=split (/&/,$input);
$a=$form[0];
・
・
・
$a=$form[5];
$a=~s/詳細=/ /;
print "<a href=\"$a\" target=\"_parent\">詳細はこちら>></a>";
0200180
2007/08/23(木) 14:10:04>>189
B,Cが既存モジュール、DがB,Cが共通して使っている親クラス、
Aがmainを書いた人が書いたカスタムモジュールということにしておいてください。
>合成(has-a、use-a)も考えるよう勧められてるよ。
合成というのは継承機構に頼らず必要なメソッドを手動でA上にディスパッチして
使うということでしょうか?
駱駝本も黒豹本も持ってない・・・
>>190
重複メソッドについてはA上に別名で定義し直すっていうのが現実的な対応でしょうね
あと、内部のメソッド呼び出しが重複する場合は、サブルーチン呼び出しに書き換えるか、
それが出来ない場合は、やはりA上に同名のメソッドを定義して、適切なクラスへ
誘導する必要があると思いました。ばかばかしい事ですが・・・
sub A::_p { $meth = caller().'::_p'; $_[0]->$meth }
>>191
なるほど、next::methodでメソッドが重複するクラスへ誘導するわけですか。
ひとつ勉強になりました。
問題点があるとすれば重複すると分かってからnext::methodを書き込まなければ
いけない点ですね。
0201デフォルトの名無しさん
2007/08/23(木) 15:09:510202デフォルトの名無しさん
2007/08/23(木) 15:30:12perlbot - Bag'o Object Tricks (the BOT)
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perlbot.pod
http://www.kt.rim.or.jp/~kbk/perl5.005/perlbot.html
0203デフォルトの名無しさん
2007/08/23(木) 16:45:260205デフォルトの名無しさん
2007/08/23(木) 20:34:00そのコードで(sortではなく)substrが遅いというのは、
・$text に utf8フラグが付いている
・配列(@position)の要素数がとても多い
・その部分が何回も(数百回,数千回といった回数)実行される
という事?
0206デフォルトの名無しさん
2007/08/23(木) 21:30:08&を含む以下のようなアドレスをフォームから送ったとき、
ttp://××.com/app/search.cgi?_mode=mode_detail&_type=rl&_object_id=0001
@form=split (/&/,$input); によって
ttp://××.com/app/search.cgi?_mode=mode_detail
_type=rl
_object_id=0001
の3つに分解されて@formに格納されてしまいます。
&を含むアドレスを分解されずにひとつの添え字の中に格納することはできますか?
0207デフォルトの名無しさん
2007/08/23(木) 21:38:58http://www.ietf.org/rfc/rfc2396.txt
http://www.ietf.org/rfc/rfc3986.txt
0208デフォルトの名無しさん
2007/08/23(木) 23:02:11&で分解してるのに、&で分解されずに格納したいだと??
わからん。言ってる意味がまったくワカラン!!!
0209デフォルトの名無しさん
2007/08/23(木) 23:21:330211187
2007/08/23(木) 23:44:38「_」で切り分けたいわけではないです。bc_abのような組み合わせもあります。
かなり長い文字列から、部分文字列を大量に切り取って、ソートしたいです。
>>205
まったくその通りで・・・頭が下がります。
utf8ですし、
ループ回数は10万ちょっとあります。
substrでは1秒近くかかります。
なので以下のように配列で処理しようとしたのですがソートがわからなくなりました。
abc_abcdからabc,abcdと取り出そうとした場合、
配列に0文字目から2文字目まで、4文字目から7文字目までという意味で(0,2,4,7)と格納する。
これだと0.05秒くらいで終わります。
0212デフォルトの名無しさん
2007/08/24(金) 00:55:42substrが遅くて困る、というなら、
substrを使わないか、回数を減らすアルゴリズムに切り替えること。
そのためのヒントとなるべき「何をしたいのか」が>>187にはない。
substrを使う>>187のアルゴリズムが絶対なら、それはsubstrから逃れられないのでは?
0213デフォルトの名無しさん
2007/08/24(金) 02:16:53オブジェクト指向プログラミングを学ぶならPerlじゃないほうがいいと思う。
個人的にはJavaがおすすめ
(静的型付のほうが最初はいい気がする)
オブジェクト指向の原則やデザパタを学ぶには「アジャイルソフトウェア開発の奥義」もおすすめ。
0214デフォルトの名無しさん
2007/08/24(金) 02:25:59オフセット情報があるんだったらunpackで一発じゃない?
0215デフォルトの名無しさん
2007/08/24(金) 19:08:39あ、そうですね。とりあえず、重複するかどうかわからないけどそう書いとくのも手ですね。
あと、同じことなのですがサブルーチンに属性をつけるのもありだと思いました。
例えば>>186で重複メソッドをロード順に実行するなら
package UNIVERSAL;
use Attribute::Handlers;
sub DUP :ATTR(CODE) {
my ($pack, $symbol) = @_;
my $sub = *{$symbol}{NAME};
my $fa = *{'A::'.$sub}{CODE};
my $fx = *{$pack.'::'.$sub}{CODE};
*{'A::'.$sub} = $fa ? sub{ $fa->(@_); $fx->(@_) } : $fx;
}
sub C::f :DUP {・・・}
sub D::f :DUP {・・・}
あと内部呼び出しで重複するメソッドはINSIDE属性をつけるとか
sub INSIDE :ATTR(CODE) {
my ($pack, $symbol) = @_;
my $sub = *{$symbol}{NAME};
return if *{'A::'.$sub}{CODE};
*{'A::'.$sub} = sub{ my $meth = caller()."::$sub"; $_[0]->$meth };
}
sub C:_p :INSIDE {・・・}
0216デフォルトの名無しさん
2007/08/24(金) 19:08:52LWP-Protocol-https-SocksChainというの見つけたのですが
サンプルコピペして実行しても
Deep recursion on subroutine "LWP::Protocol::http::SocketMethods::sysread" at C:/Perl/site/lib/IO/Socket/SSL.pm line 767.
Deep recursion on subroutine "IO::Socket::SSL::SSL_HANDLE::READ" at C:/Perl/lib/LWP/Protocol/http.pm line 392.
ってエラーでてしまいます。どうすればいいんでしょうか?
環境はActivePerl v5.8.8 WindowsXPです。
LWP-Protocol-https-SocksChain自体Googleで検索してもほとんど出てこないのでどなたか助けてください。
0217デフォルトの名無しさん
2007/08/24(金) 19:23:08ざっと見ましたが、出来るなら継承より委譲した方がいいようですね。
委譲パターンって単純にはこんな感じでしょうか
sub A::new { bless {delegate_B=>bless({},'B'), delegate_C=>bless({},'C')} }
sub A::delegate_B { $_[0]->{delegate_B} }
sub A::delegate_C { $_[0]->{delegate_C} }
package main;
$o->delegate_B->f;
$o->delegate_C->f;
0218デフォルトの名無しさん
2007/08/24(金) 19:54:30あー180ですが、これ私に対するレスですよね。
Javaのデザインパターンの考え方は参考になるので、今度図書館で探してみます。
その前に駱駝本とかを読むのが先なのかな?
(借りようと思ったけど、ずっと貸し出し中だった)
前に指摘されていた黒豹本は書店で確認しましたが、あまりオブジェクトに関する記述はなかったです。
今、perlbootとperltoocとperltootを読んでいるところです。
これとperlbotがPerlのオブジェクト〜の教典ってことになるのでしょうか
0219デフォルトの名無しさん
2007/08/24(金) 20:48:29$::request
という変数が書かれたスクリプトがあるのですが,
これ何の変数なのか教えていただけないでしょうか.
プログラミングPerlで見つけることができなくて・・・
0220デフォルトの名無しさん
2007/08/24(金) 20:53:300221デフォルトの名無しさん
2007/08/24(金) 22:09:22ただし初版(背表紙が赤い奴)では(当時まだ無かった) $::name という表現は使われていない。
(かわりに $'name という表現が使われている)
0222デフォルトの名無しさん
2007/08/25(土) 07:56:420223素人
2007/08/25(土) 15:54:10HTMLのフォームからCGIにデータを送った場合には、内容がきちんと表示される
のですが、CGIに直接アクセスした時には表示されません。どこに問題があるのか
ご教授下さい。お願いします。
#!/usr/local/bin/perl
#データファイル
$datafile='./data.dat';
#ライブラリの読み込み
require './jcode.pl';
#フォームデータの読み込み
if ($ENV{REQUEST_METHOD} eq "POST"){
read (STDIN,$input,$ENV{CONTENT_LENGTH});
}else{
$input=$ENV{QUERY_STRING};
}
#フォームデータのデコード
$input =~ tr/+/ /;
$input =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;
#SJISコード変換
&jcode::convert(\$input, 'sjis');
#フォームデータの分解
@form=split (/&/,$input);
#データのオープン
open(DAT,"+< $datafile");
flock(DAT, 2);
#データの書き込みとクローズ
seek(DAT,0,0);
print DAT @form;
close(DAT);
0224素人、続き
2007/08/25(土) 15:56:48print "<div class=\"iframe_body\">";
#データを表示する(左)
print "<div class=\"iframe_left\">";
$a=$form[0];
$a=~s/名前=/ /;
print "<b><font color=\"#ff0000\">$a</font></b>";
print "<br>";
$a=$form[1];
$a=~s/画像=/ /;
print "<img src=\"$a\" width=\"120\" height=\"100\" border=\"0\">";
print "<br>";
$a=$form[2];
$a=~s/住所=/ /;
print $a;
print "<br></div>";
・
#データを表示する(中央)と(右)があります。
・
print <<EOM;
</body>
</html>
EOM
exit;
#-----------------------------------------------------------------------------------
# HTMLヘッダー
#-----------------------------------------------------------------------------------
割愛
0225デフォルトの名無しさん
2007/08/25(土) 16:21:090226素人
2007/08/25(土) 16:42:14板違いでしたか。失礼しました。
0227デフォルトの名無しさん
2007/08/25(土) 16:42:360228素人
2007/08/25(土) 16:55:130229デフォルトの名無しさん
2007/08/25(土) 17:05:37手間、金、時間を惜しむ奴は勉強しなくてよろしい
0230素人
2007/08/25(土) 17:21:25open(IN,"ファイル名");
@form=<IN>;
close(IN);
は試してみたんですが、ぜんぜん別のことでしょうか?
とりあえず、もう一度本を読み直してみます。
0231デフォルトの名無しさん
2007/08/25(土) 20:48:47君んちの近くに心療内科ないの?
あったら一度行ってみた方が良いよ。
0232デフォルトの名無しさん
2007/08/25(土) 20:54:30君んちの近くにはないの?
0233デフォルトの名無しさん
2007/08/25(土) 21:00:45自分が行ってみて良かったから人にも勧めてるんだろ。
0234デフォルトの名無しさん
2007/08/25(土) 21:21:27何一つ無いと言うのに 全く愚かな奴だ
0235デフォルトの名無しさん
2007/08/25(土) 21:31:500236205
2007/08/25(土) 21:32:13それは大変そうだね。
普通は位置情報で処理すると、187の@a_wordへ分割するコードより遅くなるよ?
sortの準備が1秒から0.05秒に減る代わりに、sort自体が0.5秒から10秒に増える感じになる。
ソート済みの位置情報を保存して使いまわす場合には、速度は気にならないだろうけどね。
n番目という情報をソートするだけなら、例えば @a_word = sort @a_word; ならば比較関数を
@order = (0..$#a_word);
@order = sort { $a_word[$a] cmp $a_word[$b]} @order;
のように書けばいい。(@a_word = sort @a_word; より数倍遅い)
同様に
@order = sort { substr($text,$position[$a],...
と、より複雑な比較関数を使って @a_word 自体を作らない手もある。(更に数倍以上遅い)
0237デフォルトの名無しさん
2007/08/26(日) 13:55:19http://digit.que.ne.jp/work/index.cgi?Perl%e3%83%a1%e3%83%a2%2f%e3%83%a2%e3%82%b8%e3%83%a5%e3%83%bc%e3%83%ab%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%28CPAN%29
http://blog.ko-c.jp/?eid=661566">Windows
↑これらのページを参考にしてがんばっているのですがどうもうまくいきません。
NMAKE : fatal error U1077: 'C:\PROGRA~1\MID05A~1\VC\bin\cl.EXE' : リターン コー
ド '0xc0000135
このようなエラーがでてnmakeが途中で終わってしまうのですが何が原因なのでしょうか?
cl.exeのあるフォルダにはPATHを通してあります。
0238デフォルトの名無しさん
2007/08/26(日) 14:17:410239デフォルトの名無しさん
2007/08/26(日) 15:53:340240デフォルトの名無しさん
2007/08/27(月) 01:10:00ナニナニを使え、みたいなお返事でも結構ですので
0241デフォルトの名無しさん
2007/08/27(月) 08:17:58今さらだけど、属性使うとそれっぽく書ける
sub f1 :Default(0,'foo') {
my ($x, $y) = @_;
print "$x $y\n";
}
実装例
use Attribute::Handlers;
sub UNIVERSAL::Default :ATTR(CODE) {
my ($pack, $symbol, $referent, $attr, $data) = @_;
no warnings 'redefine';
no strict 'refs';
my $sub = *{$symbol}{NAME};
my $orig_func = *{$pack."::$sub"}{CODE};
*{$pack."::$sub"} = sub{
for my $i (0..$#$data) {
unless (defined($_[$i])) {splice(@_, $i, 1, $data->[$i]) }
}
$orig_func->(@_)
};
}
0242デフォルトの名無しさん
2007/08/27(月) 17:24:590243デフォルトの名無しさん
2007/08/27(月) 17:27:28たまに、戻り値を受け取る変数の型によって、値が変わる関数がありますよね?
(1)
これを自前でサブルーチンとして実装するには、どう記述すればよいのでしょうか。
(2)
この値を呼び出し側で制御することは出来ませんか。
@tmp = function();
$result = \@tmp;
のように。
よろしくお願いします。
0244デフォルトの名無しさん
2007/08/27(月) 17:53:510246デフォルトの名無しさん
2007/08/27(月) 18:10:12(2)の意味するところがわからん
0247デフォルトの名無しさん
2007/08/27(月) 18:16:57どうすりゃいいんだろう
0248デフォルトの名無しさん
2007/08/27(月) 18:17:44ソースを見る
0249デフォルトの名無しさん
2007/08/27(月) 18:19:21$result = [function()];
0250243
2007/08/27(月) 18:24:26戻り値をスカラーで受け取りつつ、関数には、リストコンテキストとして評価できないかなと。
配列のリファレンスが欲しい。
>247
ドキュメントをしっかり作るとか。
あとは、統合環境で何とかならないかな?
0251243
2007/08/27(月) 18:27:20>249
ありがとうです。そんな使い方があったのですね。
0252デフォルトの名無しさん
2007/08/27(月) 18:43:23無理だよ。コンテクストや引数、そのほか計り知れない要因によって変わる可能性があるんだから。
0253デフォルトの名無しさん
2007/08/27(月) 18:50:31なんで分からんねん って話しだが
0254デフォルトの名無しさん
2007/08/27(月) 19:01:24サブルーチンとか所在のわかっている関数はB::Deparseとかで確認できるけど、
どこから継承されているかわからない階層の深いメソッドとかはどうすりゃいいですか?
0255デフォルトの名無しさん
2007/08/27(月) 20:28:520256デフォルトの名無しさん
2007/08/27(月) 20:35:430257デフォルトの名無しさん
2007/08/27(月) 21:47:15callerで深い階層まで拾ってみるとかそんな関数使わないとか
0258254
2007/08/27(月) 21:51:26それをcoderef2textに渡せばソースが出力される。
自己解決しました。お騒がせしました。
■ このスレッドは過去ログ倉庫に格納されています