Perl 5.8级联空检查

时间:2015-04-08 17:21:11

标签: perl groovy null

我们说我有以下Groovy代码:

String name = child.getParent()?.getParent()?.getName();

请注意,getParent()可能会返回null,在这种情况下,代码会继续工作,而不会抛出空指针异常。

有没有办法在Perl 5.8的一行中清楚地做到这一点?我愿意编写一个通用的帮助方法来实现这一目标。

我遇到了几个嵌套对象的情况,我不得不这样做:

my $name = $child && $child->getParent && $child->getParent->getParent && $child->getParent->getParent->getName;

是的,这是一行,但是很难看的IMO。

3 个答案:

答案 0 :(得分:3)

我的意见中,您的原始Groovy代码无论如何都处于可读性的边界。我会以不同的方式实现它,但Perl中的类似表达式将是

my $name = (
    $node = $node->get_parent or
    $node = $node->get_parent or
    $node->get_name
);

语言的效用并不是由其用极少数字符表示复杂结构的能力来定义的

答案 1 :(得分:0)

使用eval可能有点邪恶:

my $name = eval { $child->getParent->getParent->getName }

另一种方法是使用last可以用来留下一个块(即独立{...}类似于for(1) {...}):

my $name; { $name = (($child->getParent || last)->getParent || last)->getName }

答案 2 :(得分:0)

看起来您想要从HTML页面的DOM中提取信息。为此,我建议您使用Perl模块。看看Mojo::DOM