<div>завÑегдатаи подÑказали: http://www.perlmonks.org/?node_id=973015</div><div><br /></div><div><br /></div><div>19.04.2017, 10:23, "Konstantin Cherednichenko" <dshadowukraine@gmail.com>:</div><blockquote type="cite"><div dir="auto">ÐžÑ‚Ð»Ð¸Ñ‡Ð½Ð°Ñ Ð¸Ð´ÐµÑ! СпаÑибо!</div><div><br /><div>On Apr 19, 2017 10:19, "KES" <<a href="mailto:kes-kes@yandex.ru">kes-kes@yandex.ru</a>> wrote:<br type="attribution" /><blockquote style="margin:0 0 0 0.8ex;border-left:1px #ccc solid;padding-left:1ex;">Привет.<br />
<br />
Ру Ð¼ÐµÐ½Ñ Ð²Ð¾Ñ‚ давно витает Ð¸Ð´ÐµÑ "мÑгкого вызова".<br />
Даже ещё когда пиÑал на аÑÑемблере вÑегда раздражали иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ `CALL 0`<br />
<br />
ну вот Ñнова вернулÑÑ Ðº Ñтой теме.<br />
<br />
1. Что не так?<br />
Очень чаÑто приходитÑÑ Ð¿Ð¸Ñать Ñледующий код:<br />
my $x; my $y;<br />
if( ($x =Â $obj->method)Â Â &&Â $y =Â $x->another_method ) {<br />
   $y = ...;<br />
}<br />
<br />
Пример из жизни:<br />
<br />
if( $db->query( ... )->hash->{ value } ) { ... }<br />
if( $db->resultset( 'table' )->search( ... )->related_resultset( 'table2' ) { ... }<br />
<br />
<br />
тут еÑли Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» пуÑтой результат, то код упадёт.<br />
<br />
РеÑли иÑпользовать оператор мÑгкого вызова, то можно будет не боÑÑ‚ÑŒÑÑ Ð¸Ñключений и код Ñтанет проще:<br />
<br />
use pragma 'soft_call';<br />
if( my $x =Â $obj->method~>another_method ) { ... }<br />
if( $db->query( ... )~>hash->{ value } ) { ... }<br />
if( $db->resultset( 'table' )->search( ... )~>related_resultset( 'table2' ) { ... }<br />
<br />
И вроде как вÑÑ‘ выразительно получаетÑÑ.<br />
<br />
Даже Ñама Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð°Ð³Ð¼Ñ‹ в деÑÑток Ñтрок:<br />
1. делаем плагин Ð´Ð»Ñ keyword, Ðаподобие Syntax::Keyword::Try<br />
2. цеплÑемÑÑ Ð½Ð° <a href="http://perldoc.perl.org/perlguts.html#Pluggable-runops" rel="noreferrer" target="_blank">http://perldoc.perl.org/<wbr />perlguts.html#Pluggable-runops</a><br />
3. ПÑевдокод:<br />
sub soft_call_operator {<br />
  my( $left_operand, $right_operand ) = @_;<br />
<br />
  return undef  if !defined $left_operand;<br />
<br />
  '->'( $left_operand, $right_operand ); # делаем обычную обработку вызова функции<br />
}<br />
<br />
<br />
Комментарии wellcome<br />
______________________________<wbr />_________________<br />
Kiev-pm mailing list<br />
<a href="mailto:Kiev-pm@pm.org">Kiev-pm@pm.org</a><br />
<a href="http://mail.pm.org/mailman/listinfo/kiev-pm" rel="noreferrer" target="_blank">http://mail.pm.org/mailman/<wbr />listinfo/kiev-pm</a><br />
</blockquote></div></div>
,<p>_______________________________________________<br />Kiev-pm mailing list<br /><a href="mailto:Kiev-pm@pm.org">Kiev-pm@pm.org</a><br /><a href="http://mail.pm.org/mailman/listinfo/kiev-pm">http://mail.pm.org/mailman/listinfo/kiev-pm</a><br /></p></blockquote>