2013-08-22 5 views
1

Я хочу очистить свое понимание от следующего.
Предположим, у меня есть модуль Perl с функцией, которая ожидает 3 параметра.
E.g. в функции:
my ($a, $b, $c) = @_;Есть ли подпись для методов в Perl?

Теперь эта функция вызывается двумя другими скриптами.
Один из сценариев требует некоторой «дополнительной» функциональности, поэтому. Если я передаю некоторые, например, 2 дополнительных параметра к функции, например.
my ($a, $b, $c, $d, $e) = @_; и использовать их, если они определены, это не вызовет проблем правильно?
Моя главная забота заключается в том, что в Perl нет функции или аналогичной функции? Поэтому я могу передать любые аргументы

+4

'$ a' и' $ b' зарезервированы для 'sort'. Вы не должны использовать эти два имени, поскольку они могут столкнуться. – simbabque

+0

@simbabque: Названия были примером, но приятно это знать! – Jim

ответ

3

Вы можете передать столько аргументов, сколько захотите. Все те, которые вы не назначаете, просто не будут использоваться. В форме назначения, которую вы используете, они просто останутся в @_.

sub foo { 
    my ($a, $b, $c) = @_; 
} 

foo(1, 2, 3, 4); 

В этом случае 4 никогда не будет присвоен переменной, но он все еще там.

Если вы нарежете это как foo(1, 2), это не повредит, если вы не делаете что-то с $c.

Вы не можете, однако, определить два разных поведения для foo с определенным количеством параметров в виде двух разных подсайтов с одинаковым именем. Вам нужно будет построить это самостоятельно в одном подпункте. Однако это не всегда имеет смысл.

sub foo { 
    my ($x, $y, $z) = @_; 
    if ($z) { 
    return $x + $y + $z; 
    else { 
    return $x - $y; 
    } 
} 
+0

Спасибо за исправление @amon. Это была опечатка. – simbabque

3

В Perl каждый элемент получает список скаляров и возвращает список скаляров. В C-МОГ термины, это может быть написано

SV** some_sub(SV** args); 

Где SV* является типом скалярного переменным.

Есть способы, чтобы ограничить параметры: например, используя синтаксический сахар Method::Signatures, или прототипы (пожалуйста не использовать прототипы).

Назначение списка my ($a, $b, $c, $d, $e) = @_; работает независимо от размера массива @_. Если RHS (правая сторона) имеет меньшее количество элементов, то LHS, то скаляры слева - undef. Например.

sub foo { 
    my ($x, $y, $z) = @_; 
    say "x is ", $x // "undef"; 
    say "y is ", $y // "undef"; 
    say "z is ", $z // "undef"; 
} 

say "foo(1)"; 
foo(1); 
say "foo(1, 2, 3)"; 
foo(1, 2, 3); 
say "foo(1 .. 10_000)"; 
foo(1 .. 10_000); # ten thousand arguments! 

Выход:

foo(1) 
x is 1 
y is undef 
z is undef 
foo(1, 2, 3) 
x is 1 
y is 2 
z is 3 
foo(1 .. 10_000) 
x is 1 
y is 2 
z is 3 
3

Отвечая на предмет часть только вопрос, это на благо людей, приходящих с поисковых систем:

Signatures are available in standard Perl from version 20. CPAN модули обеспечивают большую функциональность:

Я рекомендую Kavorka.

+0

Я на самом деле не пытаюсь обеспечить подпись, как в статически типизированных языках. Я просто пытаюсь убедиться, что я не буду нарушать такие вещи (поскольку я новичок в Perl и исхожу из статического языка с типизированным языком) – Jim

Смежные вопросы