2010-01-18 21 views
6

Tôi có một danh sách chứa các đối số mà tôi muốn chuyển đến một hàm. Làm cách nào để gọi hàm đó?Làm cách nào để chuyển các phần tử trong tham chiếu mảng Perl dưới dạng đối số riêng lẻ cho một chương trình con?

Ví dụ, hãy tưởng tượng tôi đã chức năng này:

sub foo { 
    my ($arg0, $arg1, $arg2) = @_; 
    print "$arg0 $arg1 $arg2\n"; 
} 

Và chúng ta hãy nói rằng tôi có:

my $args = [ "la", "di", "da" ]; 

Làm thế nào để gọi foo mà không cần viết foo($$args[0], $$args[1], $$args[2])?

+2

'APPLY' đến từ đâu? Đây có phải là cấu trúc bằng ngôn ngữ khác không? – daotoad

+3

ÁP DỤNG đến từ LISP http://nostoc.stanford.edu/jeff/llisp/21.html –

+1

@daotoad Xuất phát từ Lisp nhưng hầu hết các ngôn ngữ đều có dạng tương đương của nó. Đó là một trong những điều thực sự khó khăn đối với Google vì các ngôn ngữ khác nhau tạo nên các thuật ngữ khác nhau cho cùng một điều. –

Trả lời

9

này nên làm điều đó:

foo(@$args) 

Đó không phải là thực sự là một chức năng apply. Cú pháp đó chỉ là một tham chiếu mảng tham chiếu trở lại mảng đồng bằng. man perlref cho bạn biết thêm về các lần giới thiệu.

+0

Bạn cũng có thể xem xét không xây dựng tham chiếu để bắt đầu, tức là '@args = (" la "," de "," dah ")' hoặc thậm chí '@args = qw (la de dah);' và sau đó truyền nó với 'foo (@args)'. Điều này là sạch hơn và đơn giản hơn so với thực hiện các điệu nhảy tham khảo, mặc dù nếu bạn có những hạn chế khác (các mảng đã là một phần của một cấu trúc dữ liệu, ví dụ) nó không phải là một việc lớn. – fennec

6

Hãy thử điều này:

foo(@$args); 
10

Bạn dereference tham chiếu mảng bằng cách dán @ ở phía trước.

foo(@$args); 

Hoặc nếu bạn muốn trở thành rõ ràng hơn:

foo(@{ $args }); 
4
foo(@$args); 

Hoặc, nếu bạn có một tham chiếu đến foo:

my $func = \&foo; 
... 
$func->(@$args); 
2

Nó đơn giản. foo (@ {$ args})

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