2015-04-08 3 views
4

Допустим, у меня есть следующий код Groovy:Perl 5.8 каскадом нулевые чеки

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

Обратите внимание, что getParent() может вернуться null, и в этом случае код продолжает работать без исключения нулевых указателей броска.

Есть ли способ сделать это четко в одной строке в Perl 5.8? Я готов написать общий вспомогательный метод для этого.

Я бегу в ситуации, когда у меня есть несколько вложенных объектов, и я с делать что-то вроде:

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

Да это в одной строке, но это Fugly ИМО.

+1

Связанный: [Как обрабатывать ошибки в цепочках методов в Perl?] (Http://stackoverflow.com/questions/7064975/how-do-i-handle-errors-in-methods- chain-in-perl) – ThisSuitIsBlackNot

+0

Здесь будет полезен язык запросов (такой как XPath или CSS-селектор). – ikegami

+0

Неясно, нужно ли реализовать этот код Groovy в Perl, или если вы только что нашли другой способ бекаса на Perl. Вы серьезно? – Borodin

ответ

0

, вероятно, немного злым использует Eval:

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

альтернатива использовать last, который может быть использован, чтобы оставить блок (т.е. автономный {...} похож на for(1) {...}):

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

В мой мнение, ваш оригинальный код Groovy находится на границе удобочитаемости в любом случае. Я бы реализовать несколько иначе, но подобное выражение в Perl будет

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

Полезность языка не определяется его способностью представлять сложные конструкции в очень немногих персонажей

+1

ради удобочитаемости: в groovy нужно написать код 'child.parent? .parent? .name' OPs code verbose/javaish. – cfrick

0

Это выглядит, как вы хотите извлечь информацию из DOM на странице HTML. Для этого я рекомендую вам использовать модуль Perl, который просто делает это. Посмотрите на Mojo::DOM

Смежные вопросы