Подпрограммы Perl с точной сигнатурой / точным количеством параметров

Я где-то видел использование $ в определении подпрограммы. Чтобы узнать об этом больше, я создал различные кейсы с помощью простой подпрограммы и узнал, что она используется для определения подпрограмм с точными сигнатурами.

Кто-нибудь может подтвердить:

  1. Прав ли я? Я имею в виду, используется ли он для этой цели?
  2. Имеет ли он какое-нибудь другое применение?
  3. Есть ли другой способ получить доступ к этим параметрам внутри подпрограммы, кроме использования my $param1 = shift; или my (@params) = @_?

use strict;
use warnings;

# just a testing function
sub show($$){
    print "Inside show";
}

show(1, 1);   # works fine
show(1);     # gives compilation error
# Not enough arguments for main::show at test.pl line 8, near "1)"
# Execution of test.pl aborted due to compilation errors.

show(1, 1, 1);   # gives compilation error
# Too many arguments for main::show at test.pl line 8, near "1)"
# Execution of test.pl aborted due to compilation errors.       

person Kamal Nayan    schedule 19.05.2017    source источник
comment
У Ларри был бы самый интеллектуальный комментарий из всех нас. ;) - Думаю, двум противникам не понравилось то, что вы просто не прочитали документацию.   -  person simbabque    schedule 19.05.2017
comment
@KamalNayan: Если все начнут читать документацию полностью Это позорное отношение. Я профессионально программирую Perl почти двадцать лет и все еще читаю каждую страницу документации хотя бы раз в год. Если вы не справляетесь с этой задачей, не играйте с программированием.   -  person Borodin    schedule 19.05.2017
comment
@Borodin Извините, я не это имел в виду. Чаще всего (в основном новички) предпочитают читать небольшую часть документации.   -  person Kamal Nayan    schedule 19.05.2017
comment
Введите perldoc perltoc в свой терминал и прочитайте все перечисленное не реже одного раза в год.   -  person Sinan Ünür    schedule 19.05.2017
comment
@KamalNayan: Чаще всего (как правило, новички) предпочитают читать небольшую часть документации. да, и это повсеместное отношение приводит к тому, что мне нужен код, чтобы ответить на эти вопросы здесь. Если вы не знаете языка, пожалуйста, не заставляйте других делать вашу работу бесплатно.   -  person Borodin    schedule 19.05.2017
comment
@ SinanÜnür: Спасибо, я не знал об этой команде. И снова извините, если мои комментарии кого-то задели!   -  person Kamal Nayan    schedule 19.05.2017
comment
@KamalNayan: Я не знал об этой команде И ясно, почему вы не знали об этом.   -  person Borodin    schedule 19.05.2017
comment
Да, я признаю, я не знаю и просматриваю stackoverflow, чтобы узнать.   -  person Kamal Nayan    schedule 19.05.2017
comment
@KamalNayan: Есть много преимуществ в изучении языка по документации. Это бесплатно; это быстро; вы не тратите чье-либо время на то, чтобы попросить его рассказать вам это; обычно бывает точным; он более всеобъемлющий; и он сразу доступен в любое время дня и ночи.   -  person Borodin    schedule 19.05.2017
comment
@KamalNayan: Вы бы узнали много больше, отвечая на вопросы о Stack Overflow.   -  person Borodin    schedule 19.05.2017


Ответы (1)


Вы используете прототипы подпрограмм. Не надо. Подробнее см. Почему прототипы функций Perl 5 плохие?

Новая экспериментальная функция, представленная в 5.20, - это подпрограммные подписи . Они делают все, что вы хотели, чтобы прототипы подпрограмм могли.

Например:

use strict;
use warnings;

use feature 'signatures';
no warnings 'experimental::signatures';

sub show ( $canvas, $actor ) {
    $actor->draw( $canvas, $COLOR{default});
}

и т.д

person Sinan Ünür    schedule 19.05.2017
comment
Я где-то видел этот код, я не использую его в продакшене, просто хотел узнать в небольшом скрипте. :) - person Kamal Nayan; 19.05.2017
comment
@KamalNayan: да, люди, которые переходят на Perl с других языков, ищут подписи, находят прототипы и используют их. Но на самом деле они служат другой цели, и их почти никогда не следует использовать. А новая функция подписей является экспериментальной и может быть изменена или удалена, поэтому не используйте ее, если вам это не удобно. - person ysth; 19.05.2017