- Perl - 请问怎么用一个标量来引用一个方法 并执行此方法呢?

来源:百度文库 编辑:神马文学网 时间:2024/05/15 03:14:37
ChinaUnix.net »Perl » 请问怎么用一个标量来引用一个方法?并执行此方法呢?
页: [1]
xxgsky2005-12-2 08:15
请问怎么用一个标量来引用一个方法?并执行此方法呢?
假设:
sub aa{
my ($a,$b)=@_;
return $a.$b;
}
正常的调用
$str = aa("aa","bb");
我的想法是将一个标量指向一个方法,并将此方法存入散列表中,并在需要要调出此标量,并通过正则表达式替换其参数,并运行该方式.
我试过一个比较笨的方法,就是把整个方法当作一个字符串赋值给标量$str,并通过eval $str来执行.但我不想用这种方式,我想请教一下有没有更好的方法.
fayland2005-12-2 08:21
$str = \&aa;
$str->(‘aa‘, ‘‘bb‘);
兰花仙子2005-12-2 08:26
[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);
不知是否你想要的。
xxgsky2005-12-2 09:04
呵呵,想不到这么快就有人回复,这个论坛作为信息交流真是太好的,真是谢谢各位的支持!
你们哪种方式引用我都明白,但不是我要的效果,因为我想相把方法放到散列表中,
$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代码,以上过程是我的部份想法.
apile2005-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";
你应该说的是类似这类的吧......
xxgsky2005-12-2 10:15
明白,我大概意思就是这样了,呵呵,谢谢大侠!
xxgsky2005-12-5 02:27
[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.
请指点.
fayland2005-12-5 03:06
print ‘$tt = ‘ , $tt, "\n";
eval($tt);
die $@ if ($@);
apile2005-12-5 03:37
[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要分开设定...
xxgsky2005-12-5 03:40
其实我知道可以用eval,但我想知,为什么试的代码不行,我想知
&{$hash{method1}}("123","456");

&$tt;有什么不同?
因为print &{$hash{method1}}("123","456");和print &$tt;是一样的.
是了&{$hash{method1}}("123","456");这个句子操作符的优先级是什么啊?
fayland2005-12-5 03:54
你后来的 $tt 变成了字符串了,而不是 sub 的引用了。sub 的引用才是用 &$tt 而字符串的话就要用 eval 了。
apile2005-12-5 04:50
在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]]
xxgsky2005-12-5 05:34
哦,我明白了,谢谢,但如果我要用eval,我怎么可以得到返回值呢?
apile2005-12-5 08:55
在eval中用return...
例如:
my $rtn = eval{ return 1; };
試試看...
xxgsky2005-12-5 10:16
可以了,谢谢啊,呵呵!
利用eval的返回值比我用正则表达式的提取方法名及参数的方式简单很多啊!
查看完整版本:请问怎么用一个标量来引用一个方法?并执行此方法呢?
Copyright © 2001-2005 ChinaUnix.net   All Rights Reserved     联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
京ICP证041476号
_xyz