|
请问怎么用一个标量来引用一个方法?并执行此方法呢?
假设: sub aa{ my ($a,$b)=@_; return $a.$b; } 正常的调用 $str = aa("aa","bb"); 我的想法是将一个标量指向一个方法,并将此方法存入散列表中,并在需要要调出此标量,并通过正则表达式替换其参数,并运行该方式. 我试过一个比较笨的方法,就是把整个方法当作一个字符串赋值给标量$str,并通过eval $str来执行.但我不想用这种方式,我想请教一下有没有更好的方法. |
|
$str = \&aa; $str->(‘aa‘, ‘‘bb‘); |
|
[quote]原帖由 [i]xxgsky[/i] 于 2005-12-2 16:15 发表 假设: sub aa{ my ($a,$b)=@_; return $a.$b; } 正常的调用 $str = aa("aa","bb"); 我的想法是将一个标量指向一个方法,并将此方法存入散列表中,并在需要要调出此标量,并通过 ... [/quote]
use strict; my $a=‘111‘; my $b=‘222‘;
sub aa{ return sub { return $_[0].$_[1]; }; }
my $ref=aa();
print $ref->($a,$b);
不知是否你想要的。 |
|
呵呵,想不到这么快就有人回复,这个论坛作为信息交流真是太好的,真是谢谢各位的支持! 你们哪种方式引用我都明白,但不是我要的效果,因为我想相把方法放到散列表中, $methodstr1 引用 aa($a,$b); $methodstr2 引用 bb($a,$b);
%hash{"command1"} = $methodstr1; #把方法存到散列中 %hash{"command2"} = $methodstr2;
我调用是可以通过 $mothod = %hash{"command1"} #根据命令调出方法 $mothod =~/(\$a),(\$b)/%other{$1},%other{$2}/;#替换方法中的参数,即赋值
eval $mothod; #运行最后得出的方法
我的想法是这样,呵呵,不知自己描述够不够清楚呢?请教各位怎么有更好的实现形式(我不想通过eval的形式).我现在正在写一个XML格式的描述语言,并用perl来解析,最后生成纯perl的代码,并自动运行此perl代码,以上过程是我的部份想法. |
|
#!/usr/bin/perl sub aa{ my ($a,$b) = @_; return $a.$b; }
$method = "aa";
$hash{method1} = $method;
print &{$hash{method1}}("123","456")."\n";
你应该说的是类似这类的吧...... |
|
[quote]原帖由 [i]apile[/i] 于 2005-12-2 17:16 发表 #!/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 = ‘aa("123",BB)‘;
print ‘$tt = ‘ , $tt, "\n";
$tt =~s/BB/\"456\"/;
print ‘$tt = ‘ , $tt, "\n"; &$tt; 为什么我在后面加上我的测试代码,运行时会抛出如下错误:
123456$tt = aa("123",BB) $tt = aa("123","456") Undefined subroutine &main::aa("123","456") called at tmothod.pl line 21.
请指点. |
|
print ‘$tt = ‘ , $tt, "\n"; eval($tt); die $@ if ($@); |
|
[quote]原帖由 [i]xxgsky[/i] 于 2005-12-5 10:27 发表
#!/usr/bin/perl sub aa{ my ($a,$b) = @_; print $a.$b; return $a.$b; }
$method = "aa";
$hash{method1} = $method;
&{$hash{method1}}("123","456" ... [/quote]
因为你不能把$method与argument当成HASH of PACKAGE的key... 你只能先引用出method..再给他叁数...perl没有办法做到你想要的.... 其实你的动作...如果只是在改变量,为什麽你不把两部分分开, 1.先找到要的method.. 2.再决定要丢进去什麽叁数... 当然除非你的XML设定中,连变量都写进去了...那就没辄了. 如果是这样...建议是在XML设定中.. method与argument要分开设定... |
|
其实我知道可以用eval,但我想知,为什么试的代码不行,我想知 &{$hash{method1}}("123","456"); 与 &$tt;有什么不同? 因为print &{$hash{method1}}("123","456");和print &$tt;是一样的. 是了&{$hash{method1}}("123","456");这个句子操作符的优先级是什么啊? |
|
你后来的 $tt 变成了字符串了,而不是 sub 的引用了。sub 的引用才是用 &$tt 而字符串的话就要用 eval 了。 |
|
在perl的代码里面..每支程序都会有一个main package,如果不指明packagge, 则每支perl程序都是main packege... 而这个package里面有个hash of table纪录全域变量与local变量....全域变量包含 hash、array、scalar variable、filehandle或ref... 当你使用sub aa的时候 ,就是在跟这个hash记录有个key是aa的subroutine... 而後我们要使用他, 可以使用&{aa}去让他指向实际存放aa subroutine的位址... 所以&{aa}等於呼叫aa这个subroutine..因为他需要两个argument..所以还要再给他...
但是你的$tt是纯粹string...当你使用&{$tt}的时候...perl会去找main package的hash, 看里面有没有$tt这个key..然後因为没有$tt这个key..所以perl会回传你看到的error... 大致是这样..讲错的话..请指证...谢谢..
[[i] 本帖最后由 apile 于 2005-12-5 13:07 编辑 [/i]] |
|
哦,我明白了,谢谢,但如果我要用eval,我怎么可以得到返回值呢? |
|
在eval中用return... 例如: my $rtn = eval{ return 1; }; 試試看... |
|
可以了,谢谢啊,呵呵! 利用eval的返回值比我用正则表达式的提取方法名及参数的方式简单很多啊! |
|
|
|