Perl将参数传递给eval

时间:2012-10-03 21:29:22

标签: perl arguments eval

我在使用eval函数时遇到了问题。

我确实在SQL数据库中有一些函数名,我的目标是在perl中执行这些函数(在SQL中检索之后)。

以下是我正在做的事情,考虑到$ RssSource-> {$ k} {Proceed}包含“& test”作为从SQL检索的字符串:

my $str2 = "ABCD";
eval "$RssSource->{$k}{Proceed}";warn if $@;

sub test
{
   my $arg = shift;

   print "fct TEST -> ", $row, "\n";
}

这是正常工作并显示:

fct TEST ->

但是我希望能够将$ str2作为参数传递给$ RssSource-> {$ k} {Proceed},但我不知道怎样,我尝试的每种语法都会返回错误:

eval "$RssSource->{$k}{Proceed}$str2"
eval "$RssSource->{$k}{Proceed}($str2)"
eval "$RssSource->{$k}{Proceed}"$str2
eval "$RssSource->{$k}{Proceed}"($str2)

有人可以告诉我如何正确地将参数传递给已评估的函数吗?

非常感谢你的帮助

问候。

Florent的

5 个答案:

答案 0 :(得分:5)

我将假设$RssSource->{$k}{Proceed}始终包含name&name,否则您提出的问题没有多大意义。

my $func_name = $RssSource->{$k}{Proceed};
$func_name =~ s/&//;
my $func_ref = \&$func_name;    # Works with strict on!
$func_ref->(@args);

如果要添加一些错误检查,以下将检查是否可以调用sub:

defined(&$func_ref)

答案 1 :(得分:3)

如果您eval的字符串始终是子调用,则可以使用以下方法之一构造eval字符串:

$RssSource->{$k}{Proceed} . '($str2)'

(最一般),或

$RssSource->{$k}{Proceed} . "(\"$str2\")"

(不雅)

以下是您的解决方案遇到的问题:

eval "$RssSource->{$k}{Proceed}$str2"评估为eval "&testABCD"。这个子不存在。

eval "$RssSource->{$k}{Proceed}($str2)"评估为"&test(ABCD)"。不允许使用Bareword。

eval "$RssSource->{$k}{Proceed}"$str2一个字符串必须跟某种运算符,而不是另一个变量。

eval "$RssSource->{$k}{Proceed}"($str2)您正在尝试将字符串作为函数调用。 Perl不支持此功能。

答案 2 :(得分:2)

如果您可以更改数据库中的数据以仅包含函数名称,即test而不是&test,则可以通过符号引用调用函数,而不是使用eval:

$fn="test";
&{$fn}("argument")

答案 3 :(得分:1)

如果您说数据库只包含函数名称,则不需要eval。您可以将它们用作符号引用(但请删除&)。现代化的方法不会使用&取消引用它但使用箭头操作符:

{
    no strict 'refs'; # hopefully you have strict on already...
    $RssSource->{$k}{Proceed}->($str2);
}

答案 4 :(得分:0)

与ikegami的答案非常相似,使用can方法,这更符合我的口味。 TIMTOWTDI。

my $func_name = $RssSource->{$k}{Proceed};
$func_name =~ s/&//;
my $func_ref = __PACKAGE__->can($func_name)
  or die "No function named $func_name";
$func_ref->(@args);