2009-01-17 26 views
8

Tôi đã liếc qua một số mã tôi đã viết trong lớp Perl của tôi và tôi nhận thấy điều này.'@_' làm gì trong Perl?

my ($string) = @_; 
my @stringarray = split(//, $string); 

tôi tự hỏi hai điều: Dòng đầu tiên nơi biến là trong ngoặc, đây là một cái gì đó bạn làm khi khai báo nhiều hơn một biến và nếu tôi loại bỏ chúng nó vẫn sẽ làm việc đúng không?

Câu hỏi thứ hai sẽ là @_ làm gì?

Trả lời

21

Biến số @_ là một mảng chứa tất cả các thông số được chuyển vào một chương trình con.

Dấu ngoặc đơn xung quanh biến $string là hoàn toàn cần thiết. Họ chỉ định rằng bạn đang gán các biến từ một mảng. Nếu không có chúng, mảng @_ được gán cho $string trong ngữ cảnh vô hướng, có nghĩa là $string sẽ bằng số lượng tham số được truyền vào chương trình con. Ví dụ:

sub foo { 
    my $bar = @_; 
    print $bar; 
} 

foo('bar'); 

Đầu ra ở đây là 1 - chắc chắn không phải những gì bạn mong đợi trong trường hợp này.

Ngoài ra, bạn có thể gán biến $string mà không sử dụng các mảng @_ và sử dụng shift chức năng thay vì:

sub foo { 
    my $bar = shift; 
    print $bar; 
} 

Sử dụng một phương pháp trong khác là khá một vấn đề của hương vị. Tôi hỏi câu hỏi này rất which you can check out nếu bạn quan tâm.

5

Biến @_ là một mảng (do đó tiền tố @) chứa tất cả các tham số cho hàm hiện tại.

9

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, shiftunshift, 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ố @_.

+0

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% _ ".) –

+0

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 đó. –

+0

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. –

11

Khi bạn gặp biến đặc biệt (hoặc dấu câu) trong Perl, hãy xem the perlvar documentation. Nó liệt kê tất cả, cung cấp cho bạn một số tương đương English và cho bạn biết nó hoạt động như thế nào.

Các vấn đề liên quan