2

我正在尝试使用算术来评估写为字符串的 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 最佳实践的那部分,但它很长,我看不出它如何适用于我正在做的非常简单的情况。

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

4

2 回答 2

1

用户@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也无效,我将不胜感激。

于 2021-12-01T01:45:56.977 回答
0

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

于 2021-12-01T01:36:24.267 回答