Perl sub由string制成

zor*_*con 1 perl subroutine

我正在尝试使用包含在字符串中的perl中的sub.

目前我有类似的东西

$sub = "sub{ my $in = shift; if($in =~ /bla.*wam/){return 1;}}";
Run Code Online (Sandbox Code Playgroud)

我尝试通过这样做来使用它

$sub->("test");
Run Code Online (Sandbox Code Playgroud)

要么

&{$sub}->("test");
Run Code Online (Sandbox Code Playgroud)

上面的两个例子只是吐出整个函数,好像它是一个它找不到的sub的名字.它看起来像这样:

Undefined subroutine [function then printed here]
Run Code Online (Sandbox Code Playgroud)

我在这里弄错了什么?

fri*_*edo 5

让我们说标量$sub包含字符串"foobar".如果你说$sub->(),然后你试图调用一个名为 的子程序foobar.如果该子例程不存在,则会出错.

您正在尝试使用名称调用子例程sub{ my $in = shift; if($in =~ /bla.*wam/){return 1;}},这对于子程序来说是一个非常荒谬的名称,并且显然在您的程序中不存在.(实际上,因为它是双引号,$in可能是在你没有意识到的情况下插入的.)

所以,首先,不要这样做.

如果你想要一个匿名子程序,那就这样:

my $sub = sub { my $in = shift; if($in =~ /bla.*wam/) { return 1; } };
Run Code Online (Sandbox Code Playgroud)

然后像这样执行: $sub->("test");

如果你真的需要在字符串中执行代码,那么你可以使用eval.

my $sub = eval 'sub{ my $in = shift; if($in =~ /bla.*wam/) { return 1; } }';
Run Code Online (Sandbox Code Playgroud)

这将评估字符串中的代码并返回结果,这是一个子引用.在这些字符串来自哪里时要非常小心.制作它们的人可以让你的程序做任何他们想做的事.