2011-12-16 30 views
6

Khi đọc mô-đun Perl đã tải xuống, tôi đã tìm thấy một số cách xác định thông số đầu vào, được liệt kê như sau. Sự khác nhau giữa chúng là gì?Sự khác nhau giữa các cơ chế nhập tham số trong Perl là gì?

sub new{ 
    my $class = shift; 
    my $self = {@_}; 
    bless{$self, $class}; 
} 

sub count1{ 
    my ($self, $lab1) = @_; 
} 

sub new1{ 
    my ($class, $lab1) = @_; 
    my $self = {}; 
    bless $class, $self; 
} 

sub setpath{ 
    my $self = shift; 
} 

Trả lời

4

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]; } 
4

# 1 và # 3 là ví dụ về associating an object with a class (Hướng đối tượng Perl).

Trong # 2, @_ là danh sách các tham số được truyền cho hàm, do đó, $self$lab1 nhận giá trị của 2 thông số đầu tiên được truyền.

Trong # 4, shift() được xây dựng trong chương trình con Perl lấy một mảng làm đối số, sau đó trả về và xóa mục đầu tiên trong mảng đó. Nếu nó không có đối số, nó được thực thi ngầm trên @_. Vì vậy, $self nhận giá trị của tham số được truyền đầu tiên.

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