是否有一个模块可以在访问深度嵌套的数据结构时提供类似于 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/