2013-08-11 41 views
15

複数の配列、変数、ハッシュをサブルーチンに送る最良の方法は何ですか?配列、スカラー、ハッシュをPerlのサブルーチンに渡す

シンプルなフォーム、動作します。

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

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

私は、このバージョンの難しさを持って、私は何をしたいのかされていないグローバルを使用せずにサブルーチンに安全にデータを送信するかどうかはわからないのです。配列であること - - アップ読まれます@aがあるため

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

動作しません、:あなたがしようとした割り当てがあること

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

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

注:あなたが参照を使用することができます

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 
} 

答えて

21

リスト全体は、$s%hは未初期化のままです。

+0

サブ '$ MSG。=" \ n $ str、$ xあなたのハッシュ値= $ h - > {$ x} - > [0] $ h- > {$ x} - > [1] "; ' – BarneySchmale

5

私はTLPの答えを好むが、あなたはまた、プロトタイプを使用することができます

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

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

をプロトタイプ(\@\%$)はリスト参照のサブルーチン・コール、ハッシュリファレンス、および前スカラーに引数を強制変換引数は平らにされ、@_にロードされます。サブルーチンの内部では、配列とハッシュの代わりにリスト参照とハッシュ参照を受け取ります。

通常、ただし、don't use prototypesです。

関連する問題