1. Тщательно прочитайте perlsub<div>2. Используйте прототипы с случае, если вы делаете функцию, которая "могла-бы быть в перле", т.е. что-то похожее на встроенный функционал</div><div>3. никогда не используйте прототипы для методов (они все равно не работают)</div>
<div>4. Если вам нужно вызвать функцию без учета прототипа (как например foo($sub,$arg)), то можно подавить проверку прототипа при помощи &: &foo($sub,$arg);</div><div><br></div><div><br></div><div><div class="gmail_quote">
2012/10/17 ksvs <span dir="ltr"><<a href="mailto:ksvs1996@ymail.com" target="_blank">ksvs1996@ymail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div style="font-size:12pt;font-family:times new roman,new york,times,serif"><div>А почему для</div><div><br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<span>sub</span> <span>foo</span>(&$) {<br>    <span>my</span> ($s, $v) = @_;<br>    $s->($v);<br>}</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">Вызов </div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<span>foo</span> <span>sub</span> { <span>print</span> @_ }, "<span>hello</span>\n";</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<span>работат</span></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif"><br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
И </div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif"><span>foo</span> { <span>print</span> @_ } "<span>hello</span>\n";</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
работает</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif"><br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
А<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif"><span>my</span> $<span>print</span> = <span>sub</span> { <span>print</span> @_ };<br><span>foo</span> $<span>print</span>, "<span>hello</span>\n";</div>
<div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">Не работает?</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">Почему большую функцию не можно вынести отдельно?</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">Неужели <span><span>придется</span></span> писать</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<span>sub</span> <span>foo</span>($$);</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif"><br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">Аналогичная ситуация с массивами и <span>хешами</span>:</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif"><span>sub</span> foo(\@\%) {<br>    <span>my</span> ($a, $h) = @_;<br>    <span>print</span> <span>scalar</span> @$a, "\n";<br>
}<br><br><span>my</span> @<span>foo</span> = (1, 2);<br><span>my</span> %<span>foo</span> = (1 => 2);<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">Вот так <span>работате</span>.<br><span>foo</span> @<span>foo</span>, %<span>foo</span>;<br>
</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif"><br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">А так <br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<span>foo</span> \@foo, \%<span>foo</span>;</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">не работает.</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
<br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">А если у меня <span>ссылки</span> на массивы, что что <span><span>придется</span></span> их <span><span>разыменовывать</span></span> только для вызова?</div>
<div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif"><br></div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">
Зачем тогда такие прототипы нужны?</div><div style="font-style:normal;font-size:16px;background-color:transparent;font-family:times new roman,new york,times,serif">А если везде использовать в <span><span>прототипах</span></span> $, то
 зачем тогда эти все @ и %?<br></div></div></div><br>--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Best wishes,<br>Vladimir V. Perepelitsa aka Mons Anderson<br><<a href="mailto:inthrax@gmail.com">inthrax@gmail.com</a>>, <<a href="mailto:mons@cpan.org">mons@cpan.org</a>><br>
<a href="http://github.com/Mons">http://github.com/Mons</a><br>
</div>