2013-02-23 128 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 "])" 

當我試圖谷歌它,我發現this site,這只是讓我覺得,在子程序調用之前與&符號就足夠了。我試過了,它確實有幫助。

但是,當我後來遇到另一個問題時,使用谷歌搜索將我帶到this SO question。重點是答案的狀態

你應該調用沒有&的子例程,例如,填充(...),除非您特別想要覆蓋子的原型。如果你不知道原型是什麼,只是不要使用&。

我完全不知道Perl語境中的原型是什麼。 那麼 - 現實是怎樣的?我應該只使用&還是有其他可能更「乾淨」的解決方案?

謝謝! (順便說一句,如果我可能會問一些OT問題 - 我應該在調用它之後真的定義子例程嗎?這對我來說看起來很不自然,但是,我已經發現,恢復順序會使編譯器抱怨)

+5

'vec'是一個內置函數。 – aschepler 2013-02-23 17:31:46

+2

除了aschepler剛纔提到的'vec()'是一個內置函數(與你的子名稱衝突),你應該像這樣傳遞你的哈希引用:'vec(\%info)',否則你將擁有更復雜的哈希結構的問題。 – TLP 2013-02-23 17:33:48

+0

我大概同意在這種情況下調用vec(\%info)會更好。但是,我想編輯子程序中的內容而不影響子程序之外的變量,我不得不像現在這樣調用它,它是正確的嗎? – Karryanna 2013-02-23 17:49:44

回答

6

vec是一個perl內置函數,你得到一個名稱衝突(perldoc -f vec)。調用你的子程序別的東西。

你可能想這樣稱呼它:

mysub(\%info) 

在Perl中,你可以之前或聲明之後調用的子程序。唯一的限制就是在使用原型時,你可能不想這樣做。當你逆轉訂單時(「讓編譯器抱怨」並沒有多大幫助),你會得到什麼樣的錯誤?這可能是因爲名稱衝突。

+0

如果真的必須是'vec'這個名字,那麼可以使用subs qw/vec /'來覆蓋當前包中的內建函數。 – amon 2013-02-23 17:45:49

+0

Argh,這是一個愚蠢的錯誤。錯誤是......「Ambigous調用解析爲CORE :: vec(),或者使用&」「。它使現在完美。那麼,希望這可以在幾天和幾年的經驗中變得更好。無論如何,感謝您的幫助。 – Karryanna 2013-02-23 17:46:01

相關問題