Я довольно новичок в Perl и в настоящее время пытаюсь понять упомянутое сообщение об ошибке.Perl: Недостаточно аргументов для функции
У меня есть этот кусок кода (до сих пор в основном для тестирования pourposes)
#!/usr/bin/perl
use strict;
use warnings;
my %info = (autor => "Karryanna", jazyk => "cs");
vec([%info]);
sub vec
{
my ($hashref) = @_;
print $hashref->autor . "\n";
}
Когда я пытаюсь запустить его, это дает сообщение об ошибке
Not enough arguments for vec at test.pl line 8, near "])"
Когда я пытался Google это, я нашел this site, который только заставлял меня думать, что перед вызовом подпрограммы с амперсандом достаточно. Я попробовал, и это действительно помогло.
Однако, когда я позже столкнулся с другой проблемой, поисковик взял меня на this SO question. Дело в том, что в ответе указывается
Вы должны вызывать подпрограммы без &, например. populate (...), если вы специально не захотите переопределить прототип sub. Если вы не знаете, что такое прототип, просто не используйте &.
У меня нет абсолютно никакого представления о том, что такое прототип в контексте Perl. Итак, что такое реальность? Должен ли я использовать & или есть ли другое, возможно, более «чистое» решение?
Спасибо!
(Кстати, если я могу задать немного вопрос OT - Должен ли я действительно определить подпрограмму после ее вызова? Это кажется мне действительно неестественным, однако я уже обнаружил, что возврат порядка делает компилятор жалоба)
'vec' - это встроенная функция. – aschepler
Помимо того, что aschepler только что сказал о 'vec()' как о встроенной функции (которая конфликтует с именем вашего суб), вы, вероятно, должны передать свой хэш-код так: 'vec (\% info)', иначе вы будете иметь проблемы с более сложными структурами хэшей. – TLP
Я, вероятно, согласен с тем, что при вызове vec (\% info) было бы лучше в этом случае. Тем не менее, я хотел отредактировать содержимое внутри подпрограммы, не затрагивая переменную вне подпрограммы, мне пришлось бы ее называть, как я делаю это сейчас, правильно? – Karryanna