[Moscow.pm] Пост на Хабре ?Функции в Perl?

Antonio Nikishaev a на lelf.me
Ср Авг 13 12:58:59 PDT 2014


On 13 Aug 2014, at 23:10, Flore <flore at ya.ru> wrote:

> Эмм, возможно, я пропустила, но я бы добавила небольшое объяснение про прототипы функции, что это спорная штука, и многие считают, что оно скорее зло, чем добро.

Не то чтобы зло, просто очень специальная штука.

А то что не про Method::Signatures, не про ням ням signatures в 5.20 ни слова — авторам полный и сплошной низачот.


> И вот простой пример: допустим, есть функция, которая хочет два скаляра в качестве аргументов, один обязательный, один нет (это будет записано как sub func($;$)). Я завожу массив @arr = qw/a b/ и вызываю функцию от массива: func(@arr). Логично будет подумать, что "а" положится в первый аргумент, а "b" во второй.

В 5.20 с сигнатурами всё по-человечески как ожидается.
(На самом деле если прототипы уметь готовить, то их поведение тоже вполне логично. Но в любом случае их трогать за исключением 0.001% случаев не надо.)


> Однако, это не так. Перл хочет скаляр, поэтому то, что он получает, он и интерпретирует как скаляр, а получает он массив - и значит, он просто берёт длину массива, то есть, 2, а второй аргумент функции у него будет неопределён. И никакой ошибки не напишет, поэтому отследить это будет трудно.
> Большая статья на тему: http://www.perlmonks.org/?node_id=861966
> Статья покороче: http://www.perlmonks.org/?node_id=406231
>  
> 13.08.2014, 19:34, "Andrey Asyakin" <asan999 at gmail.com>:
>> Ступил по поводу $_[0]{}, бывает.
>> 
>> 
>> 
>> 
>> 13.08.2014 18:40, Victor Efimov пишет:
>> 
>>  13 августа 2014 г., 18:14 пользователь Andrey Asyakin
>>  <asan999 at gmail.com> написал:
>>  Критика)
>> 
>>  В статье написано, что в Perl параметры в функцию передаются по ссылке.
>>  Возможно правильней было бы написать, что элементы @_, $_[0], и т.д.
>>  являются алиасами, то бишь магическими переменными.
>>  Ссылка это ссылка все же, это может ввести в заблуждение.
>>  "пареметр по ссылке" - это больше общепрограммистский термин.
>> 
>>  https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29
>>  ===
>>  Передача параметра по ссылке означает что копируется не само значение,
>>  а адрес исходной переменной (как в случае передачи параметра по
>>  адресу), однако синтаксис используется такой, чтобы программисту не
>>  приходилось использовать операцию разыменования и он мог иметь дело
>>  непосредственно со значением, хранящимся по этому адресу (как в случае
>>  передачи параметра по значению).
>>  ===
>> 
>>  как раз "не приходилось использовать операцию разыменования"
>> 
>>  но то что это алиасинг - согласен. это впринципе больше перловое. как
>>  раз не вижу отличий в алиасинге и "передаче по ссылке". магия тоже
>>  передаётся, но это внутренности перл.
>>  Кстати, хмм, не знал до недавнего момента, что с элеменами @_можно работать
>>  без разыменовывания:
>> 
>>    perl -E 'f({x => 42}); sub f { say $_[0]{x}, $_[0]->{x} }'
>>  а что тут необычного? ведь вроде считается что любой "->" между "]" и
>>  "{" можно просто удалить?
>>  13.08.2014 16:30, Тимур Нозадзе пишет:
>> 
>>  Всем спасибо на добром слове. Мы старались.
>>  Но а как же конструктивная критика? ;)
>> 
>> 
>>  13 августа 2014 г., 16:03 пользователь Denis Fedoseev
>>  <denis.fedoseev at gmail.com> написал:
>>  Отличная статья, все просто и понятно - молодцы :)
>> 
>> 
>>  13 августа 2014 г., 15:51 пользователь Naim Sh <shafiev at gmail.com>
>>  написал:
>>  Ребята, вы молодцы . +1
>> 
>> 
>>  On 08/13/2014 04:29 PM, Alexey Shrub wrote:
>>  Приветствую,
>> 
>>  да, вчера видал, бегло просмотрел, неплохо и весьма подробно описано
>> 
>>  Wed, 13 Aug 2014 13:17:51 +0400 от Тимур Нозадзе
>>  <timur.nozadze at gmail.com>:
>>  Мы тут, дабы принесть немного света в наш мир, коллективно соорудили
>>  статью:  http://habrahabr.ru/company/regru/blog/232933/ .
>>  Между прочим, пользуется большим интересом среди хабрапользователей,
>>  что не может не радовать. И даже никто не троллит Perl в комментах. Так что,
>>  может быть, у Perl-сообщества ещё не всё так плохо. ;)
>>  Приглашаем всех поучаствовать в обсуждении.
>>  --
>>  Moscow.pm mailing list
>>  moscow-pm at pm.org | http://moscow.pm.org
>>  --
>>  С уважением, Денис Федосеев
>> 
>>  --
>>  Moscow.pm mailing list
>>  moscow-pm at pm.org | http://moscow.pm.org
>>  --
>>  С уважением, Тимур Нозадзе
>> 
>> 
>> 
>> 
>>  --
>>  Moscow.pm mailing list
>>  moscow-pm at pm.org | http://moscow.pm.org
>> -- 
>> Moscow.pm mailing list
>> moscow-pm at pm.org | http://moscow.pm.org
>> 
> -- 
> Moscow.pm mailing list
> moscow-pm at pm.org | http://moscow.pm.org



Подробная информация о списке рассылки Moscow-pm