小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

- Perl - 請(qǐng)問(wèn)怎么用一個(gè)標(biāo)量來(lái)引用一個(gè)方法 并執(zhí)行此方法呢?

 老莊走狗 2005-12-15

ChinaUnix.net ? Perl ? 請(qǐng)問(wèn)怎么用一個(gè)標(biāo)量來(lái)引用一個(gè)方法?并執(zhí)行此方法呢?

頁(yè): [1]

xxgsky 2005-12-2 08:15
請(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)有更好的方法.

fayland 2005-12-2 08:21
$str = \&aa;
$str->(‘a(chǎn)a‘, ‘‘bb‘);

蘭花仙子 2005-12-2 08:26
[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);

不知是否你想要的。

xxgsky 2005-12-2 09:04
呵呵,想不到這么快就有人回復(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ò)程是我的部份想法.

apile 2005-12-2 09:16
#!/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ō)的是類似這類的吧......

xxgsky 2005-12-2 10:15
明白,我大概意思就是這樣了,呵呵,謝謝大俠!

xxgsky 2005-12-5 02:27
[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).

fayland 2005-12-5 03:06
print ‘$tt = ‘ , $tt, "\n";
eval($tt);
die $@ if ($@);

apile 2005-12-5 03:37
[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è)定...

xxgsky 2005-12-5 03:40
其實(shí)我知道可以用eval,但我想知,為什么試的代碼不行,我想知
&{$hash{method1}}("123","456");

&$tt;有什么不同?
因?yàn)閜rint &{$hash{method1}}("123","456");和print &$tt;是一樣的.
是了&{$hash{method1}}("123","456");這個(gè)句子操作符的優(yōu)先級(jí)是什么啊?

fayland 2005-12-5 03:54
你后來(lái)的 $tt 變成了字符串了,而不是 sub 的引用了。sub 的引用才是用 &$tt 而字符串的話就要用 eval 了。

apile 2005-12-5 04:50
在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]]

xxgsky 2005-12-5 05:34
哦,我明白了,謝謝,但如果我要用eval,我怎么可以得到返回值呢?

apile 2005-12-5 08:55
在eval中用return...
例如:
my $rtn = eval{ return 1; };
試試看...

xxgsky 2005-12-5 10:16
可以了,謝謝啊,呵呵!
利用eval的返回值比我用正則表達(dá)式的提取方法名及參數(shù)的方式簡(jiǎn)單很多啊!


查看完整版本: 請(qǐng)問(wèn)怎么用一個(gè)標(biāo)量來(lái)引用一個(gè)方法?并執(zhí)行此方法呢?


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多