- Trong Perl khi lời gọi hàm có một danh sách các tham số, các tham số đó sẽ tự động gán cho một danh sách với tên @_. Chương trình con xác định giá trị các tham số bằng cách truy cập vào danh sách các biến này.
Ví dụ:
Trong trường hợp này khi gọi hàm tổng biến $a được gán cho $_[0], biến $b được gán cho $_[1] và hàm tính tổng $a + $b.
Truyền cả một danh sách cho hàm : Xét ví dụ sau :
Với hàm này khi gọi, ta có thể truyền cho nó một mảng, một danh sách, hay một tập hợp danh sách hay tập hợp biến.
&addlist (@mang); &addlist ("1", "2", "3"); &addlist ($a, @mb, $c);
Và khi khai báo biến cục bộ ta cũng có thể làm: my (@list) = @_;
my (@list1, @list2) = @_; my ($a, @mb, $c) = @)_;
Trong trường hợp thứ 3, $_[0] được gán cho biến $a, các phần tử tiếp theo của @_ là phần tử của mảng @mb, tiếp theo phần tử cuối được gán cho $c. Tuy nhiên trong một số trường hợp có thể $c = null, các phần tử còn lại của @_ được gán cho các phần tử của mảng @mb.
Truyền tham số bằng cách dùng bí danh(Passing Arrays by Name Using Aliases Không biêt dich có đúng không)
Như đã thấy, Perl cho phép truyền cả một mảng như là một tham số. Khi hàm được gọi, tất cả các giá trị của mảng tham số sẽ được truyền cho mảng @_ được định nghĩa trong hàm.
Nếu mảng được truyền quá lớn, sẽ mất nhiều thiều thời gian và bộ nhớ. Để làm cho chương trình có hiệu quả hơn, Perl cho phép truyền mảng tham số qua tên bằng cách thay @ bởi * trong lúc định nghĩa mảng trong hàm và trong lời gọi hàm.
Khi hàm được thực hiện, nó sẽ dùng chính mảng thực truyền cho hàm để thao tác thay vì tạo ra một bản sao của nó. Lời gọi hàm với *mang thay vì @mang chỉ cho ta biết mảng thực @mang được sử dụng (và có thể được thay đổi nếu cần) trong hàm. Tức là khi hàm được thực hiện mảng @mang_con
chính là mảng @mang, hay tên mảng @mang_con được đồng nhất với tên mảng @mang. Hay nói cách khác khi hàm được thực hiện @mang con có bí danh là @mang, và khi hàm kết thúc
@mang_con không còn có bí danh @mang. Khi hàm được gọi lại với tham số khác, @mang_con lại có một bí danh mới.
Có thể nói đây là cách truyền tham bién trong Perl, bởi vì tất cả các sự thay đổi tham số trong hàm đều dẫn tới sự thay đổi trong chương trình chính.
Chú ý :
- Nếu có một biến và một mảng cùng tên thì cả biến và mảng đều có hiệu lực trong lời gọi hàm. Ví dụ:
- Ta cũng có thể truyền nhiều biến, mảng hay danh sách theo cách này