2008-12-02 7 views
6

यहां एक छोटा परीक्षण प्रोग्राम है:पर्ल मेरे सरणी squashing क्यों है?

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

अपने कार्य नामों के बाद ($;@) से छुटकारा पाएं और यह ठीक काम करता है।

10

आप पर्ल प्रोटोटाइप को गलत समझ रहे हैं। उन्हें हटा दें और यह ठीक काम करेगा।

देखें: Why are Perl 5's function prototypes bad?

संबंधित मुद्दे