Bạn cần phải vượt qua từng mảng như một tài liệu tham khảo, nếu không @x
của bạn trong phần phụ sẽ gobble phạm vi đối số TOÀN BỘ, để lại @y
khoảng không quảng cáo trống và $z
giá trị không xác định.
Điều này xảy ra bởi vì the comma operator - trong bối cảnh danh sách - sẽ biến một @x, @y, $z
vào một mảng duy nhất bao gồm tất cả các yếu tố của @x
Tiếp theo tất cả các yếu tố của @y
và sau đó một giá trị của $z
; của bạn @x
trong phụ sẽ gobble lên phạm vi kết hợp ENTIRE của các đối số, để lại @y
một mảng trống và $z
một giá trị undef.
Một nguồn gây nhầm lẫn khác là việc bạn đặt tên cho cả hai biến là @x
, mặc dù thực tế là chúng hoàn toàn độc lập với nhau do quy tắc phạm vi. Thực hành tốt là đặt tên cho chúng một cái gì đó khác biệt để tránh phải đoán bạn muốn sử dụng cái nào, ví dụ: gọi mảng đầu tiên của chương trình con @x2
. Vui lòng lưu ý rằng bạn có thể chuyển mảng thành tham chiếu theo một trong hai cách - tham chiếu đến mảng ban đầu (phương pháp tiếp cận truyền theo tham chiếu thực) cũng như tham chiếu đến một bản sao của mảng - sẽ hoạt động như bạn muốn mã nguồn gốc của bạn cư xử và vượt qua giá trị.
use strict; use warnings;
my @x = qw(AAAA BBBB CCCC DDDD EEEE);
my @y = qw(1111 2222 3333 4444 5555);
my $z = "hello";
Hello(\@x,\@y,$z);
# If you wish to pass a reference of a COPY of the array,
# so that you can modify it inside the subroutine without modifying the original,
# instead call Hello([@x], [@y], $z);
exit(0);
sub Hello {
my ($x2,$y2,$z2) = @_;
# Now, you de-reference array reference $x2 via @$x2 or $x2->[$i]
# where previously you used @x2 or $x2[$i]
print "$_\n" for @$x2;
print "$_\n";
print "$_\n" for @$y2;
print "$_\n";
print "$z2\n";
}
vì lợi ích của tiết lộ đầy đủ, Perl Thực tiễn tốt nhất cuốn sách không khuyến khích sử dụng phụ mẫu (Tôi muốn lên bầu câu trả lời của bạn nếu nó được làm rõ thusly) - http://stackoverflow.com/questions/3991474/ is-using-prototype-to-declaration-array-reference-context-on-subroutine-args-a-good/3991558 # 3991558 – DVK