Предупреждения в Perl Eval - PullRequest
       379

Предупреждения в Perl Eval

4 голосов
/ 25 января 2011

Мне нужно скрыть предупреждения в eval, но остальная часть кода должна продолжать выдавать предупреждающие сообщения. Вот что у меня есть -

eval "\$value = $hash->{key}";

теперь значение $ hash -> {key} может быть вызовом функции, например:

$hash->{key} = "function(0.01*$another_var)";

Проблема возникает, когда $another_var равен undef (или ""). Скрипт просто выдает следующее сообщение -

Аргумент "" не является числовым в умножение (*) в строке (eval 1381) 1.

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

Ответы [ 3 ]

9 голосов
/ 26 января 2011

Оберните ваш код в блок no warnings.

...
{
    no warnings;
    eval "\$value = $hash->{key}";
}
...

Вы также можете отключить определенные классы предупреждений. См. perllexwarn для иерархии категорий предупреждений и perldiag для категории, к которой относится любое конкретное предупреждение.

{
    no warnings qw(uninitialized numeric);
    eval "\$value = $hash->{key}";
}

(бла-бла-бла, стандартный отказ от ответственности, что любой, кто отключил бы предупреждения, не может оказаться в пределах 25 футов от бла-бла-машины)

3 голосов
/ 26 января 2011

Вы уверены, что не хотите делать что-то вроде:

my $href;
my $somevar = 8;
$href->{foo} = sub { $somevar * 4 };
my $var = $href->{foo}->();

Если вы не уверены, является ли $ href -> {foo} скаляром, ref кода и т. Д., Вы можете проверитьэто с помощью функции ref () или, лучше, с Scalar :: Util :: reftype ().

0 голосов
/ 26 января 2011

Измените ключ хеша на "function( 0.01 * ($another_var // 0) )"

$another_var // 0 эквивалентно defined($another_var) ? $another_var : 0.

...