2010-05-21 29 views

Trả lời

10

Vâng, nếu bạn muốn hai mảng bạn có thể sử dụng một nguyên mẫu:

sub foo (\@\@) { 
    my $arr1 = shift; 
    my $arr2 = shift; 

    # Access arrays as references 
} 

foo(@wiz, @waz); # @wiz and @waz won't be flattened. 

Nhưng có rất nhiều cách để có được xung quanh Prot otypes, và tôi thích tránh chúng ở hầu hết các nơi. Bạn có thể chỉ cần bỏ qua mẫu thử nghiệm và tự chuyển tham chiếu:

sub foo { 
    my $arr1 = shift; 
    my $arr2 = shift; 

    # Access arrays as references 
} 

foo(\@wiz, \@waz); # Pass in wiz/waz as refs 
foo([1,2,4],[3,5,6]); # Hard coded arrays 

Nếu bạn chưa làm việc với tài liệu tham khảo, hãy xem perlreftut để được hướng dẫn tốt.

+0

có vẻ như nguyên mẫu là giải pháp tốt hơn, vì nó sẽ không yêu cầu người dùng thực hiện bất kỳ điều gì đặc biệt để chuyển đối số danh sách. cảm ơn – Mike

+14

@ Giống như vậy, tôi khuyên bạn nên chống lại nguyên mẫu, vì một lập trình viên có kinh nghiệm perl sẽ ngạc nhiên hơn bởi họ hơn là yêu cầu để vượt qua một tham chiếu. Xem http://stackoverflow.com/questions/297034/why-are-perl-function-prototypes-bad để biết thêm về lý do tại sao các nguyên mẫu bị cau mày. – daotoad

+0

@ Giống như vậy, tôi thường sử dụng nguyên mẫu để tạo ra lỗi trong đặc tả mẫu thử nghiệm mà tôi vừa mới nhận ra. Vì vậy, nếu bạn đã thử mẫu mã của tôi và nó đã không làm việc, lưu ý sự thay đổi trong nguyên mẫu. – daotoad

5

Nếu bạn chuyển hai danh sách theo giá trị ... bạn sẽ nhận được một danh sách lớn trong @_.

my(@list1,@list2) = @_; không thực hiện bất kỳ ý nghĩa:

#!/usr/bin/perl 

sub test 
{ 
    my (@a, @b) = @_; 

    print "@a\n"; 
    print "@b\n"; 
} 

my @array1 = (1,2,3); 
my @array2 = (5,6,7); 

test(@array1, @array2); 

này sẽ kết thúc in:

1 2 3 5 6 7 
<blank line> 

Để vượt qua hai mảng, bạn sẽ cần phải vượt qua chúng bằng cách tham khảo:

test(\@array1, \@array2); 

Và trong phụ của bạn, bạn cần coi chúng là tham chiếu:

sub test 
{ 
    my ($arrayRef1, $arrayRef2) = @_; 
    print "@$arrayRef1\n"; 
    print "@$arrayRef2\n"; 
} 
Các vấn đề liên quan