|
請問怎么用一個標(biāo)量來引用一個方法?并執(zhí)行此方法呢?
假設(shè): sub aa{ my ($a,$b)=@_; return $a.$b; } 正常的調(diào)用 $str = aa("aa","bb"); 我的想法是將一個標(biāo)量指向一個方法,并將此方法存入散列表中,并在需要要調(diào)出此標(biāo)量,并通過正則表達(dá)式替換其參數(shù),并運(yùn)行該方式. 我試過一個比較笨的方法,就是把整個方法當(dāng)作一個字符串賦值給標(biāo)量$str,并通過eval $str來執(zhí)行.但我不想用這種方式,我想請教一下有沒有更好的方法. |
|
$str = \&aa; $str->(‘a(chǎn)a‘, ‘‘bb‘); |
|
[quote]原帖由 [i]xxgsky[/i] 于 2005-12-2 16:15 發(fā)表 假設(shè): sub aa{ my ($a,$b)=@_; return $a.$b; } 正常的調(diào)用 $str = aa("aa","bb"); 我的想法是將一個標(biāo)量指向一個方法,并將此方法存入散列表中,并在需要要調(diào)出此標(biāo)量,并通過 ... [/quote]
use strict; my $a=‘111‘; my $b=‘222‘;
sub aa{ return sub { return $_[0].$_[1]; }; }
my $ref=aa();
print $ref->($a,$b);
不知是否你想要的。 |
|
呵呵,想不到這么快就有人回復(fù),這個論壇作為信息交流真是太好的,真是謝謝各位的支持! 你們哪種方式引用我都明白,但不是我要的效果,因?yàn)槲蚁胂喟逊椒ǚ诺缴⒘斜碇? $methodstr1 引用 aa($a,$b); $methodstr2 引用 bb($a,$b);
%hash{"command1"} = $methodstr1; #把方法存到散列中 %hash{"command2"} = $methodstr2;
我調(diào)用是可以通過 $mothod = %hash{"command1"} #根據(jù)命令調(diào)出方法 $mothod =~/(\$a),(\$b)/%other{$1},%other{$2}/;#替換方法中的參數(shù),即賦值
eval $mothod; #運(yùn)行最后得出的方法
我的想法是這樣,呵呵,不知自己描述夠不夠清楚呢?請教各位怎么有更好的實(shí)現(xiàn)形式(我不想通過eval的形式).我現(xiàn)在正在寫一個XML格式的描述語言,并用perl來解析,最后生成純perl的代碼,并自動運(yùn)行此perl代碼,以上過程是我的部份想法. |
|
#!/usr/bin/perl sub aa{ my ($a,$b) = @_; return $a.$b; }
$method = "aa";
$hash{method1} = $method;
print &{$hash{method1}}("123","456")."\n";
你應(yīng)該說的是類似這類的吧...... |
|
[quote]原帖由 [i]apile[/i] 于 2005-12-2 17:16 發(fā)表 #!/usr/bin/perl sub aa{ my ($a,$b) = @_; return $a.$b; }
$method = "aa";
$hash{method1} = $method;
print &{$hash{method1}}("123","456")."\n& ... [/quote] #!/usr/bin/perl sub aa{ my ($a,$b) = @_; print $a.$b; return $a.$b; }
$method = "aa";
$hash{method1} = $method;
&{$hash{method1}}("123","456");
$tt = ‘a(chǎn)a("123",BB)‘;
print ‘$tt = ‘ , $tt, "\n";
$tt =~s/BB/\"456\"/;
print ‘$tt = ‘ , $tt, "\n"; &$tt; 為什么我在后面加上我的測試代碼,運(yùn)行時會拋出如下錯誤:
123456$tt = aa("123",BB) $tt = aa("123","456") Undefined subroutine &main::aa("123","456") called at tmothod.pl line 21.
請指點(diǎn). |
|
print ‘$tt = ‘ , $tt, "\n"; eval($tt); die $@ if ($@); |
|
[quote]原帖由 [i]xxgsky[/i] 于 2005-12-5 10:27 發(fā)表
#!/usr/bin/perl sub aa{ my ($a,$b) = @_; print $a.$b; return $a.$b; }
$method = "aa";
$hash{method1} = $method;
&{$hash{method1}}("123","456" ... [/quote]
因?yàn)槟悴荒馨?method與argument當(dāng)成HASH of PACKAGE的key... 你只能先引用出method..再給他叁數(shù)...perl沒有辦法做到你想要的.... 其實(shí)你的動作...如果只是在改變量,為什麼你不把兩部分分開, 1.先找到要的method.. 2.再決定要丟進(jìn)去什麼叁數(shù)... 當(dāng)然除非你的XML設(shè)定中,連變量都寫進(jìn)去了...那就沒輒了. 如果是這樣...建議是在XML設(shè)定中.. method與argument要分開設(shè)定... |
|
其實(shí)我知道可以用eval,但我想知,為什么試的代碼不行,我想知 &{$hash{method1}}("123","456"); 與 &$tt;有什么不同? 因?yàn)閜rint &{$hash{method1}}("123","456");和print &$tt;是一樣的. 是了&{$hash{method1}}("123","456");這個句子操作符的優(yōu)先級是什么啊? |
|
你后來的 $tt 變成了字符串了,而不是 sub 的引用了。sub 的引用才是用 &$tt 而字符串的話就要用 eval 了。 |
|
在perl的代碼里面..每支程序都會有一個main package,如果不指明packagge, 則每支perl程序都是main packege... 而這個package里面有個hash of table紀(jì)錄全域變量與local變量....全域變量包含 hash、array、scalar variable、filehandle或ref... 當(dāng)你使用sub aa的時候 ,就是在跟這個hash記錄有個key是aa的subroutine... 而後我們要使用他, 可以使用&{aa}去讓他指向?qū)嶋H存放aa subroutine的位址... 所以&{aa}等於呼叫aa這個subroutine..因?yàn)樗枰獌蓚€argument..所以還要再給他...
但是你的$tt是純粹string...當(dāng)你使用&{$tt}的時候...perl會去找main package的hash, 看里面有沒有$tt這個key..然後因?yàn)闆]有$tt這個key..所以perl會回傳你看到的error... 大致是這樣..講錯的話..請指證...謝謝..
[[i] 本帖最后由 apile 于 2005-12-5 13:07 編輯 [/i]] |
|
哦,我明白了,謝謝,但如果我要用eval,我怎么可以得到返回值呢? |
|
在eval中用return... 例如: my $rtn = eval{ return 1; }; 試試看... |
|
可以了,謝謝啊,呵呵! 利用eval的返回值比我用正則表達(dá)式的提取方法名及參數(shù)的方式簡單很多啊! |
|