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
无效,请给予解释。
我正在尝试使用算术来计算 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
无效,请给予解释。