Perl 安全地测试可存储兼容性的标量

Perl 安全地测试可存储兼容性的标量,perl,Perl,我有一个程序,它接受一个perl数据结构,它是一个可存储的标量。有没有一种方法可以测试标量是否是有效的可存储对象,如果不是,就不会死掉 例如,如果我这样做: use Storable qw(freeze thaw); my $ref = thaw("lol_not_storable") 我返回“可存储二进制图像v54.111比我(v2.8)在/usr/local/lib/perl/5.12.4/Storable.pm第420行,在test.pl第5行更新” 我想弄清楚是否有可能在没有eval的

我有一个程序,它接受一个perl数据结构,它是一个可存储的标量。有没有一种方法可以测试标量是否是有效的可存储对象,如果不是,就不会死掉

例如,如果我这样做:

use Storable qw(freeze thaw);
my $ref = thaw("lol_not_storable")
我返回“可存储二进制图像v54.111比我(v2.8)在/usr/local/lib/perl/5.12.4/Storable.pm第420行,在test.pl第5行更新”

我想弄清楚是否有可能在没有eval的情况下干净地处理这些异常。是否可以不重写可存储的Perl模块

eval { thaw("lol_not_storable"); };
这和

eval qq/thaw("lol_not_storable");/;
在这种情况下,Perl有足够的机会解析第一个,但等待解析第二个。请注意,以下是编译错误:

use 5.014;
use strict;
use warnings;

say 'Would print without compile error';
eval { $i++; };
^D

Global symbol "$i" requires explicit package name at - line 8.
Execution of - aborted due to compilation errors.
eval'$i++'
则不会。我想你听到的大部分关于
eval
的劝阻更多的是后者,而不是前者。后者将字符串作为代码进行计算,前者主要告诉Perl“不要死”

以下是字符串版本:

use 5.014;
use strict;
use warnings;

say 'Would print without compile error';
eval ' $i++;';
产出:

Would print without compile error
代码仍然无法编译,但仅当它是
eval
-ed时,并且仅当我选中
$@
时才有效,其内容如下:

$@= 'Global symbol "$i" requires explicit package name at (eval 24) line 1.
'
用魔法做到这一点:)


您对评估有何异议?(或者是它的一个包装,比如?@cjm什么都没有,但我已经知道如何用eval捕捉这个错误。文档中有一个“错误报告”部分,我希望找到一个可以使用它的解决方案。我自己无法让它工作。
use Data::Dumper;
use Storable qw(freeze thaw read_magic);

my $storable_str = freeze( [ 1 .. 42 ] );
print Dumper( read_magic($storable_str) );
# prints:
# $VAR1 = {
#     'netorder'   => 0,
#     'hdrsize'    => 15,
#     'version'    => '2.7',
#     'minor'      => 7,
#     'longsize'   => 8,
#     'ptrsize'    => 8,
#     'version_nv' => '2.007',
#     'byteorder'  => '12345678',
#     'major'      => 2,
#     'intsize'    => 4,
#     'nvsize'     => 8
# };

my $ordinary_str = join( ',', (1 .. 42) );
print Dumper( read_magic($ordinary_str) );
# prints:
# $VAR1 = undef;

# So:
if(read_magic($something_to_check)){
    my $ref = thaw($something_to_check);
}else{
    # foo
}