Khi chương trình con được gọi, các tham số được truyền sẽ được đưa vào một mảng đặc biệt @_
. Người ta có thể tiêu thụ mảng này bằng cách dịch chuyển các giá trị ra ngoài my $foo = shift
hoặc bằng cách gán mảng trực tiếp my ($foo,$bar)[email protected]_;
Thậm chí có thể sử dụng các giá trị trực tiếp từ mảng: $_[0]
Tại sao lại so sánh với các giá trị khác? Việc gán mảng trực tiếp là tiêu chuẩn và phổ biến nhất. Đôi khi, cách dịch chuyển được sử dụng khi có các giá trị trailing tùy chọn. Việc sử dụng mảng trực tiếp không được khuyến khích ngoại trừ trong vài hốc nhỏ: các hàm bao bọc đang gọi các hàm khác, đặc biệt là bên trong các đối tượng. các hàm bao bọc các hàm khác và sửa đổi các đầu vào. Ngoài ra hình thức đặc biệt của goto &func
mà ngay lập tức giảm ngăn xếp cuộc gọi hiện tại và các cuộc gọi func trên giá trị hiện tại của @_
.
# use shift for optional trailing values
use v5.10;
my $foo = shift;
my $bar = shift // 'default bar value';
my $baz = shift // 'default baz value';
#obj method to call related non-object function.
sub bar { my $self = shift; _bar(@_) }
sub longname { shortname(@_) }
sub get { return $_[0]->$_[1]; }