2015-09-23 4 views
1

perlcritic арбитру с Expression форме «Eval» [BuiltinFunctions :: ProhibitStringyEval] на первой Eval линии, используя код:Избегайте PerlCritic когда вставляя переменные с Eval

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} 

Есть обходной путь, используя интерполяцию строки? Идея состоит в том, чтобы иметь набор правил в файле конфигурации и позволить коду читать и оценивать их.

Благодаря

+3

perlcritic всегда может быть "фиксированной", добавив '## не critic' на ошибочную строку – mob

+3

... а именно:' мой $ результат = Eval $ правило; ## no crit (ProhibitStringyEval); – toolic

+1

Кстати, это '|' (побитовое или) должно быть, вероятно, '||' (логическое или). – ikegami

ответ

1

Perlcritic не является последней инстанцией. Если вы знаете, что делаете и почему, просто отключите данный «грех» (либо глобально в конфигурации, либо добавив ## no critic к нарушившей строке).

В этом случае вы можете использовать двойные кавычки вместо одиночных кавычек и проверять, есть ли только нули и единицы в результирующих строках, прежде чем оценивать их. Реализация парсера и оценщика логических формул тоже не такая сложная.

+0

Вы были быстрее. :) – simbabque

4

can turn individual Perl::Critic rules off для конкретных блоков. Добавьте комментарий как это. Обратите внимание на двойной комментарий ##.

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

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

Как это работает на блоке, вы хотите сделать это в минимально возможном объеме, так же, как use или no.

Имеет смысл пояснить в комментарии, почему вы это сделали. Обычно у вашей команды были бы веские основания выбирать правила, и вы должны их отключить, только если у вас есть больше причин для вашего конкретного случая.

+1

Я знал, что могу отключить их, просто хотел узнать, может ли какой-то код быть каким-то образом изменен, чтобы избежать предупреждения PerlCritic – Albert

6

Критик здесь, чтобы вы подумали: есть ли причина, чтобы выражение было там как строка? Можно ли его избежать, учитывая многочисленные подводные камни и высокие риски безопасности? Вернее, риски и проблемы стоит избегать небольшой работы?

Для начала вы могли бы использовать следующее:

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}->(); 
+0

Если конфигурационный файл должен определять новые правила, это фактически не поможет. Я считаю, что есть пример в Perl_Higher Order для почти точно именно этого. – simbabque

+3

@simbabque, Вот почему я не сказал «вы должны использовать следующее».В такой ситуации было бы лучше создать определяющий правила язык. В конфигурационном файле нет места для кода Perl. – ikegami

Смежные вопросы