我正在嘗試使用算術來評估 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 最佳實踐的那部分,但它很長,我看不出它如何適用于我正在做的非常簡單的情況。
什么是評價功能,然后的好辦法?
uj5u.com熱心網友回復:
用戶@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也無效,我將不勝感激。
uj5u.com熱心網友回復:
$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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/371914.html
標籤:perl perl-critic
上一篇:為什么在正則運算式中需要(?(R)...|...)if條件?
下一篇:Perl:數詞
