【问题标题】:Warnings in Perl EvalPerl 评估中的警告
【发布时间】:2011-06-15 11:33:09
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 我认为如果你在做一个字符串评估,你真的需要重新考虑你的方法。 Perl 支持一流的函数,因此您几乎可以肯定地实现您想要的,而无需 eval 或抑制警告。如果您能更清楚地了解潜在问题,您会得到更好的答案。
  • 谢谢。我听到你在字符串 eval 部分。所以我有一个数据文件,假设它有 2 列 A 和 B。现在基于配置文件,我可以得出第三列 C,即 0.01 * B(或 $B)。但我不能说 B 列中是否总是有东西,我也不知道用户想要 $B 还是 $A,直到我点击 eval。

标签: perl warnings eval undef


【解决方案1】:

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

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

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

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

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

【讨论】:

  • blah blah blah 使用散列代替它们是 blah blah 并且更安全
  • blah blah blah 不要使用字符串形式的 eval - 请参阅 Perl 最佳实践 Ch 8.7 和 search.cpan.org/…
【解决方案2】:

你确定你不想做这样的事情吗:

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

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

【讨论】:

    【解决方案3】:

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

    $another_var // 0 等价于defined($another_var) ? $another_var : 0

    【讨论】:

    • @Pavel:这个运算符出现在 Perl 5.10(2007 年 12 月 18 日发布)中。也可以使用 dor-patch 将其反向移植到 5.8.x。
    • 大多数运行 Perl5.8 的人没有修补它的选项。否则他们不会停留在 5.8 上。因此,当您使用 5.10+ 的功能时,通知人们是一种很好的形式(最重要的是,通过适当的“use
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2011-03-29
    • 2013-01-27
    • 2019-09-19
    相关资源
    最近更新 更多