5

我需要在 eval 中隐藏警告,但其余代码应继续抛出警告消息。这是我所拥有的 -

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

现在 $hash->{key} 的值可以是函数调用,例如:

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

$another_varundef(或"")时,问题就来了。该脚本只是以以下消息结束 -

参数 "" 在 (eval 1381) 第 1 行的乘法 (*) 中不是数字。

有什么建议可以避免这种情况吗?我正在考虑的一个选择是解析括号内的值并首先评估它,但它与我正在处理的数据相当复杂。

4

3 回答 3

10

将您的代码包装在一个no warnings块中。

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

您还可以禁用特定类别的警告。有关perllexwarn警告类别的层次结构以及perldiag任何特定警告所属的类别,请参阅。

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

(废话废话标准免责声明,任何会禁用警告的人都不适合进入加法机废话的 25 英尺范围内)

于 2011-01-25T21:11:31.033 回答
3

你确定你不会做类似的事情:

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

如果您不确定 $href->{foo} 是否是标量、代码 ref 等,您可以使用 ref() 函数进行检查,或者更好的是使用 Scalar::Util::reftype()。

于 2011-01-25T22:35:06.370 回答
0

将哈希键更改为"function( 0.01 * ($another_var // 0) )"

$another_var // 0相当于defined($another_var) ? $another_var : 0

于 2011-01-25T21:42:16.003 回答