Perl có hai ngữ cảnh, ngữ cảnh vô hướng và bối cảnh danh sách khác nhau. Một mảng '@_
', nếu được sử dụng trong ngữ cảnh vô hướng sẽ trả về kích thước của mảng.
Vì vậy, với hai ví dụ này, mẫu đầu tiên cung cấp cho bạn kích thước của mảng @_
và cột còn lại cung cấp cho bạn phần tử đầu tiên.
my $string = @_ ;
my ($string) = @_ ;
Perl có ba 'Default' biến $_
, @_
, và tùy thuộc vào người bạn hỏi %_
. Nhiều hoạt động sẽ sử dụng các biến này, nếu bạn không cung cấp cho chúng một biến để làm việc. Ngoại lệ duy nhất là không có hoạt động nào hiện tại sẽ theo mặc định sử dụng %_
.
Ví dụ: chúng tôi có push
, pop
, shift
và unshift
, tất cả sẽ chấp nhận mảng làm thông số đầu tiên. Nếu bạn không cho họ tham số, họ sẽ sử dụng biến 'mặc định' thay thế. Vì vậy 'shift;
' giống với 'shift @_;
'
Cách mà các chương trình con được thiết kế, bạn không thể chính thức cho trình biên dịch biết giá trị bạn muốn trong biến nào. Cũng có ý nghĩa khi chỉ sử dụng biến mảng 'mặc định' '@_
' để giữ các đối số.
Vì vậy, ba chương trình con này (gần như giống hệt nhau).
sub myjoin{
my ($stringl, $stringr) = @_;
return "$stringl$stringr";
}
sub myjoin{
my $stringl = shift;
my $stringr = shift;
return "$stringl$stringr";
}
sub myjoin{
my $stringl = shift @_;
my $stringr = shift @_;
return "$stringl$stringr";
}
Tôi nghĩ cái đầu tiên hơi nhanh hơn hai cái kia, vì bạn không sửa đổi biến số @_
.
Nguồn
2009-01-17 05:29:18
Phản hồi tốt. Tôi không nghĩ rằng% _ là bao giờ được sử dụng trong Perl, tuy nhiên. (Ý tôi là, nó không bao giờ được giả định và nó không phải là một biến đặc biệt của bất kỳ loại nào khác. Người dùng có thể sử dụng nó, tất nhiên, nhưng họ thậm chí sẽ không lưu bất kỳ tổ hợp phím nào bằng cách gõ, ví dụ: "keys" thay vì "keys% _ ".) –
Tôi không nghĩ rằng tôi đã từng gặp bất kỳ tính năng Perl tích hợp nào sẽ sử dụng% _, theo mặc định, nhưng nó vẫn được coi là một trong các biến mặc định. Hoặc ít nhất tôi nghĩ tôi nhớ đọc ở đâu đó. –
Không có bất kỳ từ nào về% _ trong perlvar. Tôi đã không nhìn thấy nó ở bất cứ nơi nào trong nhiều năm của tôi thực hành chuyên nghiệp trong perl. –