perl - 是否可以像 Template Toolkit 那样安全地访问嵌套数据结构中的数据?

标签 perl

是否有一个模块可以在访问深度嵌套的数据结构时提供类似于 Template Toolkit 的功能?我想提取类似 $a = $hash{first}[0]{second}{third}[3] 的内容,而不必测试结构的每个部分以查看它是否符合我预计。如果 %hash = {} 我想要 $a = undef,则不会产生错误。

最佳答案

Perl 将完全按照您的描述进行操作

此功能称为自动生存。这意味着容器对象在您使用它们时就会立即存在。只要您不违反自己设定的任何先例,这一点就有效。

例如,当您已将某些内容用作数组引用时,尝试将其作为散列取消引用是一个错误。更一般地,如果定义了该值,则仅当它包含对该类型的引用时,才可以将其作为特定类型取消引用。

如果您还想防止误用,可以将嵌套查找包装在 eval block 中:

my $x = eval{ $hash{first}[0]{second}{third}[3] };

如果eval失败,这将返回undef。请注意,这不是一个字符串 eval,它会写成 eval '....';。在 block 形式中,Perl 的 eval 类似于其他语言中的 try {...} 结构。

要确定eval是否失败或者该位置的值是否确实是undef,请测试特殊变量$@是否是真的。如果是这样,则eval失败,原因将在$@中。可以这样写:

my $x = eval{ $hash{first}[0]{second}{third}[3] };

if (!$x and $@) { die "nested dereference failed: $@" }

或者您可以使用模块 Try::Tiny它抽象了实现细节并防止出现一些边缘情况:

use Try::Tiny;

my $x;
try {
    $x = $hash{first}[0]{second}{third}[3];
} catch {
    die "nested dereference failed: $_";
};

关于perl - 是否可以像 Template Toolkit 那样安全地访问嵌套数据结构中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3058083/

相关文章:

perl - 在 Perl 中用空格连接字符串。有内置插件吗?

perl - xml-rpc with coldfusion - 如何传入参数?

mysql - 使用perl DBI在数据库中插入带有单引号(')的数组

c - 如何使用 SWIG 在 C 中构建 Perl 哈希?

arrays - 比较两个关联数组

python - 如何在Linux环境中解码丝绸文件并将其转换为PCM/WAV格式

regex - 匹配正则表达式并在单行代码中分配结果

regex - Perl正则表达式提取两个连续的单词

mysql - 在 Rackspace 中移动大型数据库的脚本 - Perl

python - 使用 WebKit(或 Gecko)查找呈现的 HTML 元素位置