我们说我有以下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。
答案 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