Спасибо. Оказывается я старую доку читал.
Там не было прототипа "+".



________________________________
 From: MonsAnderson <[email protected]>
To: Moscow.pm group <[email protected]> 
Sent: Thursday, 18 October 2012, 15:27
Subject: Re: [Moscow.pm] Прототипы
 

1. Тщательно прочитайте perlsub
2. Используйте прототипы с случае, если вы делаете функцию, которая "могла-бы 
быть в перле", т.е. что-то похожее на встроенный функционал
3. никогда не используйте прототипы для методов (они все равно не работают)
4. Если вам нужно вызвать функцию без учета прототипа (как например 
foo($sub,$arg)), то можно подавить проверку прототипа при помощи &: 
&foo($sub,$arg);


2012/10/17 ksvs <[email protected]>

А почему для
>
>
>sub foo(&$) {
>    my ($s, $v) = @_;
>    $s->($v);
>}
>
>
>Вызов 
>foo sub { print @_ }, "hello\n";
>работат
>
>
>И 
>foo { print @_ } "hello\n";
>работает
>
>
>А
>
>my $print = sub { print @_ };
>foo $print, "hello\n";
>Не работает?
>
>
>Почему большую функцию не можно вынести отдельно?
>
>
>Неужели придется писать
>sub foo($$);
>
>
>
>
>Аналогичная ситуация с массивами и хешами:
>
>
>sub foo(\@\%) {
>    my ($a, $h) = @_;
>    print scalar @$a, "\n";
>}
>
>my @foo = (1, 2);
>my %foo = (1 => 2);
>
>
>
>Вот так работате.
>foo @foo, %foo;
>
>
>
>
>
>А так 
>
>foo \@foo, \%foo;
>не работает.
>
>
>А если у меня ссылки на массивы, что что придется их разыменовывать только для 
>вызова?
>
>
>Зачем тогда такие прототипы нужны?
>А если везде использовать в прототипах $, то зачем тогда эти все @ и %?
>
>--
>Moscow.pm mailinglist
>[email protected] | http://moscow.pm.org
>
>


-- 
Bestwishes,
Vladimir V. PerepelitsaakaMonsAnderson
<[email protected]>, <[email protected]>
http://github.com/Mons

-- 
Moscow.pm mailinglist
[email protected] | http://moscow.pm.org
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить