2008-12-02 29 views
6

Dưới đây là một chương trình thử nghiệm ngắn:Tại sao Perl đè bẹp mảng của tôi?

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"; 

Tại sao là sản phẩm này:

sql: 3 
params: 

Thay vì điều này?

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

Trả lời

21

Đó là bởi vì khi bạn gọi foo(@_), nguyên mẫu cho foo() buộc tham số đầu tiên (đó là một mảng) được chuyển đổi thành một đại lượng vô hướng (đó là số phần tử trong @_).

Xem câu trả lời cho câu hỏi trước đây của tôi yêu cầu "Why are Perl Function Prototypes Bad"?

FWIW, bạn có thể giữ nguyên mẫu tại chỗ nếu bạn thay đổi bar như sau:

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

loại bỏ ($;@) sau tên hàm của bạn và hoạt động tốt.

Các vấn đề liên quan