5

eval 内で警告を非表示にする必要がありますが、残りのコードは引き続き警告メッセージをスローする必要があります。これが私が持っているものです-

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

$hash->{key} の値は、次のような関数呼び出しになる可能性があります。

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

問題$another_varundef(または"") の場合です。スクリプトは、次のメッセージで失敗します-

(eval 1381) 行 1 の乗算 (*) の引数 "" は数値ではありません。

これを回避する方法はありますか?私が考えていた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 に答える