gpt4 book ai didi

perl - 我在 Perl 中使用 Data::Dumper 序列化了我的数据。现在,当我评估它时,我得到 "Global symbol "$VAR 1"requires explicit package name"

转载 作者:行者123 更新时间:2023-12-01 07:11:15 31 4
gpt4 key购买 nike

我使用 Data::Dumper 将我的数据序列化为 Perl 中的字符串。现在在另一个程序中,我尝试使用 eval 对其进行反序列化。我得到:

Global symbol "$VAR1" requires explicit package name

我正在使用 use warnings; use strict;在我的程序中。

我是这样的 eval输入代码:
my $wiki_categories = eval($db_row->{categories});
die $@ if $@;
/* use $wiki_categories */

我怎样才能让我的程序因为 "$VAR1" 而死掉?未声明为 my ?

我应该附加 "my "$db_row->{categories} 之前在 eval ?像这样:
my $wiki_categories = eval("my ".$db_row->{categories});

我还没有对此进行测试,但我认为它会起作用。

还有其他方法可以做到这一点吗?也许将它包装在某个 block 中,然后对该 block 关闭严格?我从来没有做过,但我看到它提到过。

任何帮助表示赞赏!

最佳答案

这很正常。默认情况下,当 Data::Dumper 序列化数据时,它会输出如下内容:

$VAR1 = ...your data...

要使用 Data::Dumper 进行序列化,需要稍微配置一下。 Terse作为最重要的设置选项,它会关闭 $VAR事物。
use Data::Dumper;

my $data = {
foo => 23,
bar => [qw(1 2 3)]
};

my $dumper = Data::Dumper->new([]);
$dumper->Terse(1);

$dumper->Values([$data]);
print $dumper->Dump;

然后可以将结果直接评估为变量。
my $data = eval $your_dump;

您可以使用各种技巧来缩小 Data::Dumper 的大小,但总体而言,它既快速又节省空间。主要的缺点是它只是 Perl 并且非常不安全。如果有人可以修改您的转储文件,他们就拥有您的程序。

CPAN 上有一些模块可以为您解决这个问题,还有更多,例如 Data::Serializer .

关于perl - 我在 Perl 中使用 Data::Dumper 序列化了我的数据。现在,当我评估它时,我得到 "Global symbol "$VAR 1"requires explicit package name",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11144926/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com