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