Perl のSafeモジュールのrevalを使用していますが、eval された文字列を解析できない場合に警告が生成されないようにしたいです (実際には、警告がまったく生成されないようにしたいのです)。
たとえば、次のコード:
use strict; use warnings;
use Safe;
use feature qw/say/;
my $cft = Safe->new;
my $x = $cft->reval(') 1' );
my $y = $cft->reval('2' );
say "x: $x";
say "y: $y";
結果:
Number found where operator expected at (eval 5) line 1, near ") 1"
(Missing operator before 1?)
Use of uninitialized value $x in concatenation (.) or string at ./test line 12.
x:
y: 2
私が達成しようとしているのは、$x = undef および $y = 2 で、警告がないことです。「警告なし」を入れてみました。新しいスコープ内ですが、reval 内から生成される警告には影響しません (ただし、@DavidO で指摘されているように、「初期化されていない値」の警告は無効になります):
use strict; use warnings;
use Safe;
use feature qw/say/;
my $cft = Safe->new;
{
no warnings;
my $x = $cft->reval(') 1' );
my $y = $cft->reval('2' );
say "x: $x";
say "y: $y";
}
どういうわけか「警告なし」は Safe コンパートメント内にある必要があると思います。そのため、「警告なし」も先頭に追加しようとしました。評価される文字列に:
use strict; use warnings;
use Safe;
use feature qw/say/;
my $cft = Safe->new;
{
my $x = $cft->reval( 'no warnings;' . ') 1' );
my $y = $cft->reval( 'no warnings;' . '2' );
say "x: $x";
say "y: $y";
}
このように reval は警告を発行しませんが、両方の変数が未定義です:
Use of uninitialized value $x in concatenation (.) or string at ./test line 10.
x:
Use of uninitialized value $y in concatenation (.) or string at ./test line 11.
y:
他に何を試すべきかわかりません。問題の説明が十分に明確であることを願っています。