分享

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

 老庄走狗 2005-12-15

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

页: [1]

xxgsky 2005-12-2 08:15
请问怎么用一个标量来引用一个方法?并执行此方法呢?

假设:
sub aa{
     my ($a,$b)=@_;
     return $a.$b;
}
正常的调用
$str = aa("aa","bb");
我的想法是将一个标量指向一个方法,并将此方法存入散列表中,并在需要要调出此标量,并通过正则表达式替换其参数,并运行该方式.
我试过一个比较笨的方法,就是把整个方法当作一个字符串赋值给标量$str,并通过eval $str来执行.但我不想用这种方式,我想请教一下有没有更好的方法.

fayland 2005-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);

不知是否你想要的。

xxgsky 2005-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代码,以上过程是我的部份想法.

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";


你应该说的是类似这类的吧......

xxgsky 2005-12-2 10:15
明白,我大概意思就是这样了,呵呵,谢谢大侠!

xxgsky 2005-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.

请指点.

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 发表

#!/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要分开设定...

xxgsky 2005-12-5 03:40
其实我知道可以用eval,但我想知,为什么试的代码不行,我想知
&{$hash{method1}}("123","456");

&$tt;有什么不同?
因为print &{$hash{method1}}("123","456");和print &$tt;是一样的.
是了&{$hash{method1}}("123","456");这个句子操作符的优先级是什么啊?

fayland 2005-12-5 03:54
你后来的 $tt 变成了字符串了,而不是 sub 的引用了。sub 的引用才是用 &$tt 而字符串的话就要用 eval 了。

apile 2005-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]]

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的返回值比我用正则表达式的提取方法名及参数的方式简单很多啊!


查看完整版本: 请问怎么用一个标量来引用一个方法?并执行此方法呢?


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多