Perl Eval 中的警告

发布于 2024-10-14 20:25:08 字数 473 浏览 5 评论 0原文

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

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

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

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

$another_varundef (或 <代码>“”)。该脚本只是抛出以下消息 -

参数“”不是数字 (eval 1381) 行处的乘法 (*) 1.

有什么建议可以避免这种情况吗? 我想到的一个选择是解析括号内的值并首先对其进行评估,但它对于我正在处理的数据来说非常复杂。

I need to hide warnings within eval but the rest of the code should continue to throw warning messages. Here is what I have -

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

now value of $hash->{key} could be a function call, like:

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

The problem comes when $another_var is undef (or ""). The script just craps out with the following message -

Argument "" isn't numeric in
multiplication (*) at (eval 1381) line
1.

Any suggestions how I can avoid this?
One option i was thinking was to parse the value inside parenthesis and evaluate that first, but its quite complex with the data I am dealing with.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

〃安静 2024-10-21 20:25:08

将代码包装在 no warnings 块中。

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

您还可以禁用特定类别的警告。请参阅 perllexwarn 了解警告类别的层次结构和 perldiag 用于任何特定警告所属的类别。

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

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

Wrap your code in a no warnings block.

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

You can also disable specific classes of warnings. See perllexwarn for the hierarchy of warning categories and perldiag for the category that any particular warning belongs to.

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

(blah blah blah standard disclaimer that any one who would disable warnings is unfit to get within 25 feet of an adding machine blah blah)

别挽留 2024-10-21 20:25:08

你确定你不想这样做:

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

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

Are you sure you wouldn't rather do something like:

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

If you're not sure whether $href->{foo} is a scalar, code ref, etc, you can check it with the ref() function, or better, with Scalar::Util::reftype().

玻璃人 2024-10-21 20:25:08

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

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

Change the hash key to be "function( 0.01 * ($another_var // 0) )"

$another_var // 0 is equivalent to defined($another_var) ? $another_var : 0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文