2013-02-23 4 views
2

Я довольно новичок в 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 - Должен ли я действительно определить подпрограмму после ее вызова? Это кажется мне действительно неестественным, однако я уже обнаружил, что возврат порядка делает компилятор жалоба)

+5

'vec' - это встроенная функция. – aschepler

+2

Помимо того, что aschepler только что сказал о 'vec()' как о встроенной функции (которая конфликтует с именем вашего суб), вы, вероятно, должны передать свой хэш-код так: 'vec (\% info)', иначе вы будете иметь проблемы с более сложными структурами хэшей. – TLP

+0

Я, вероятно, согласен с тем, что при вызове vec (\% info) было бы лучше в этом случае. Тем не менее, я хотел отредактировать содержимое внутри подпрограммы, не затрагивая переменную вне подпрограммы, мне пришлось бы ее называть, как я делаю это сейчас, правильно? – Karryanna

ответ

6

vec является встроенной функцией perl, вы получаете столкновение имен (perldoc -f vec). Назовите свою подпрограмму чем-то еще.

Вы, вероятно, хотите назвать это так:

mysub(\%info) 

В Perl можно вызвать подпрограмму до или после того, как вы объявляете его. Единственными ограничениями на это являются использование прототипов, которые вы, вероятно, не хотите делать. Какие ошибки вы получаете, когда вы меняете порядок («делает жалобу компилятора» не очень помогает)? Это может быть из-за столкновения имен.

+0

Если это действительно должно быть имя 'vec', можно было бы использовать subs qw/vec /' для переопределения встроенного для текущего пакета. – amon

+0

Argh, это глупая ошибка. Ошибка была ... «Неоднозначный вызов разрешен как CORE :: vec(), квалифицируется как таковой или использует &». Теперь это совершенный момент.Хорошо, надеюсь, что это будет лучше с многолетним опытом. В любом случае, спасибо за вашу помощь. – Karryanna

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