【问题标题】:How to interpret a string as Perl code and execute it without eval如何将字符串解释为 Perl 代码并在没有 eval 的情况下执行它
【发布时间】:2012-08-06 09:29:27
【问题描述】:

我知道可以使用“string-eval”。但我正在寻找一些替代方案来实现它,而不需要eval。原因是“字符串评估”使 Perl 批评者失败,根据客户端策略,我不能使用它。

如果没有eval,有什么替代方法可以做到这一点?

这是我想要做的:

我将动态生成的代码引用传递给函数。此函数评估此代码引用并将结果分配给变量。

【问题讨论】:

  • 如果您无法根据客户策略进行评估,那么尝试使用其他构造来找到做同样事情的东西听起来根本不是一个好主意。找到另一种方法来做你需要做的事情。
  • 你最好再问一个问题,解释你想做什么,人们会告诉你如何在没有eval的情况下做到这一点。
  • 您是否尝试将eval 字符串写入单独的文件并执行它(通过do)?
  • 评估动态代码几乎从来都不是一个好主意。
  • 向我们展示您要编译的 code ref 字符串中的内容

标签: perl


【解决方案1】:

Perl 批评者反对 string-eval,因为“将字符串解释为 perl 代码并执行它”通常是任何问题的糟糕解决方案。

你不能仅仅通过寻找另一个函数来做同样的事情来解决它(好吧,你可以,但这完全没有抓住重点)。

【讨论】:

  • 非常感谢。您的回答很棒,感谢您的及时回复。但是可以通过 daxim 的回复快速解决。
【解决方案2】:

Coderefs 不需要eval 来运行。只需取消引用 coderef 即可调用它。这在perldoc perlref 中有解释。

my $code = sub {
    my ($name) = @_;
    say "Hi, $name!";
};
$code->('rpg');

【讨论】:

    【解决方案3】:

    这对我有用。

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    sub exec_code {
        my ($c) = @_;
        return &{$c};
    }
    
    my $coderef = sub {
        print "Hello, from sub";
    };
    
    exec_code($coderef);
    

    【讨论】:

      猜你喜欢
      • 2022-07-07
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多