2

perlcritic在以下代码的第一行eval中抱怨“eval”[BuiltinFunctions::ProhibitStringyEval] 的表达式形式:

use strict;
use warnings;
use feature qw/say/;

my $hasTwitter = 1;
my $validEmail = 0;

my $rule   = '${hasTwitter} | ${validEmail}';
my $result = eval $rule;
say "Result ->  $result";

$result = eval { $rule };
say "Result -> $result";

我尝试使用 eval {} 来修复 perlCritic 但它没有返回预期的结果。

回应是:

Result ->  1
Result -> ${hasTwitter} | ${validEmail}

是否有使用字符串插值的解决方法?这个想法是在配置文件上有一组规则,让代码读取和评估它们。

谢谢

4

3 回答 3

7

批评家的存在让您思考:表达式作为字符串存在是否有理由?鉴于众多陷阱和高安全风险,是否可以避免?或者更确切地说,这些风险和问题值得避免一些工作吗?

首先,您可以使用以下内容吗?

my $rule = sub { $hasTwitter || $validEmail };

my $result = $rule->();

或者可能

my $rule = 'has_twitter_or_email';

my %rules = (
   has_twitter_or_email => sub { $hasTwitter || $validEmail },
);
my $result = $rules{$rule}->();
于 2015-09-23T15:55:20.190 回答
5

您可以为特定块关闭单个 Perl::Critic 规则。添加这样的评论。请注意,双重注释##是故意的。

my $rule   = '${hasTwitter} | ${validEmail}';

## no critic 'ProhibitStringyEval'
my $result = eval $rule;

由于这适用于每个块,因此您将希望在尽可能小的范围内执行此操作,就像 a useor no

在评论中解释你为什么这样做是有道理的。通常,您的团队有充分的理由选择规则,并且只有在您对特定案例有更好的理由时才应该关闭它们。

于 2015-09-23T15:47:32.020 回答
1

Perlcritic 不是最终的权威。如果您知道自己在做什么以及为什么,只需禁用给定的“sin”(在配置中全局或添加## no critic到违规行)。

在这种情况下,您可以使用双引号而不是单引号,并在计算结果之前验证结果字符串中只有零和一。实现逻辑公式的解析器和评估器也不是那么难。

于 2015-09-23T15:46:30.830 回答