2008-12-02 55 views
6

這裏有一個短的測試程序:爲什麼Perl壓縮我的數組?

sub foo($;@) { 
    my $sql = shift; 
    my @params = @_; 

    print "sql: $sql\n"; 
    print "params: " . join(",", @params); 
} 

sub bar($;@) { 
    foo(@_); 
} 

bar("select * from blah where x = ? and y = ?",2,3); 
print "\n"; 

爲什麼輸出這樣的:

sql: 3 
params: 

而不是這樣的?

sql: select * from blah where x = ? and y = ? 
params: 2,3 

回答

21

這是因爲當調用foo(@_),原型爲foo()迫使第一參數(這是一個數組),以被轉換成一個標量(這是在@_元素的數量)。

查看我之前提問「Why are Perl Function Prototypes Bad」的答案?

FWIW,你可以保持原型的地方,如果你改變bar這樣的:

sub bar($;@) { 
    foo(shift, @_); 
} 
5

擺脫($;@)後你的函數名稱,它工作正常。