2013-08-11 27 views
15

Cách tốt nhất để gửi nhiều mảng, biến, băm cho một chương trình con là gì?Truyền mảng, vô hướng và băm đến chương trình con trong Perl

Biểu mẫu đơn giản, hoạt động.

my $msg = &getMsg(1,2,3); 
print $msg; 

sub getMsg { 
    my($a, $b, $c) = @_; 
} 

Tôi đang gặp khó khăn với phiên bản này và không chắc chắn cách gửi dữ liệu an toàn cho chương trình con mà không sử dụng toàn cầu mà không phải là điều tôi muốn làm.

my @array = ('a','b','c'); 
my $str = "Hello"; 
my %hash = (
    'a' => ['100','nuts'], 
    'b' => ['200','bolts'], 
    'c' => ['300','screws'], 
); 

my $msg = getMsg(@array, $str, %hash); 
print $msg; 

sub getMsg { 
    my (@a, $s, %h) = @_; 
    my $MSG; 
    foreach my $x (@a) { 
     $MSG .= "\n$str, $x your hash value = $h{$x}[0] $h{$x}[1]"; 
    } 
    return $MSG 
} 

Trả lời

21

Bạn có thể sử dụng tài liệu tham khảo:

getMsg(\@array, \%hash, $scalar); 

sub getMsg { 
    my ($aref, $href, $foo) = @_; 
    for my $elem (@$aref) { 
     ... 
    } 
} 

Lưu ý rằng việc chuyển nhượng bạn đã cố gắng:

my (@a, $s, %h) = @_; 

Không làm việc, vì @a - là một mảng - sẽ húp lên toàn bộ danh sách, để lại $s%h chưa được khởi tạo.

+0

Lưu ý rằng hashref được thông qua cần phải được hủy đăng ký khi được sử dụng trong phụ '$ MSG. =" \ N $ str, $ x giá trị băm của bạn = $ h -> {$ x} -> [0] $ h- > {$ x} -> [1] "; ' – BarneySchmale

5

Tôi thích câu trả lời TLP, nhưng bạn cũng có thể sử dụng một nguyên mẫu:

getMsg(@array, %hash, $scalar); 

sub getMsg (\@\%$) { 
    my ($aref, $href, $foo) = @_; 
    for my $elem (@$aref) { 
     ... 
    } 
} 

Nguyên mẫu (\@\%$) cưỡng ép các đối số để gọi chương trình con để một tài liệu tham khảo danh sách, một tham chiếu băm, và một vô hướng trước sự đối số được làm phẳng và được tải vào @_. Bên trong chương trình con, bạn nhận được một tham chiếu danh sách và một tham chiếu băm thay vì một mảng và một băm.

Thông thường, mặc dù, don't use prototypes.

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