Perl:除了 eval 之外,评估表达式的首选方法是什么?

Perl: What is the preferred way of evaluating expressions besides eval?

我正在尝试使用算术来计算 a 函数,它被写成一个字符串:

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':default';

my $str = '0.203580063041053 * $x + -0.0273785448865449';
my $x = 3;
my $ans = eval $str;
say $ans;

以上代码有效,并给出了正确答案。

然而,perlcritic 说最好避免上面的代码:Expression form of "eval" at line 10, column 11. See page 161 of PBP. (Severity: 5)

我已经阅读了 Perl 最佳实践的那一部分,但是它很长,而且我看不出它如何适用于像我正在做的这样非常简单的情况。

那么什么是评估函数的好方法?

$str = '0.203580063041053 * $x + -0.0273785448865449' 本质上是一个函数 所以我会使用 'sub' 来创建这样的函数:

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':default';

sub str{
       my $x = shift;
       0.203580063041053 * $x + -0.0273785448865449;
}
my $x = 3;
my $ans = eval { str($x) } ;
say $ans;

用户@ikegami 在 Algorithm::CurveFit 中引用了另一个包,推测是 Math::Symbolic。

我能想到的最简单的写法是

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':default';
use Math::Symbolic ':all';

# https://metacpan.org/pod/Math::Symbolic
my $str = '0.203580063041053 * x + -0.0273785448865449';
my $x = 3;
my $tree = Math::Symbolic->parse_from_string($str);
my ($sub) = Math::Symbolic::Compiler->compile_to_sub($tree);
my $ans = $sub->($x);
say $ans;

根据 perlcritic,这段代码是可以的,并且没有使用 eval 循环。

我不知道为什么 my ($sub) 有效,而 my $sub 无效,请给予解释。