2013-02-27 11 views
11

に変数とし、この多次元配列:

$name = "jennifer"; 
$age = 100; 

$list[0][0] = "TEST NAME 2"; 
$list[0][1] = "TEST GROUP 2"; 
$[0][2] = 10; 

$[1][0] = "TEST NAME 2"; 
$[1][1] = "TEST GROUP 2"; 
$[1][2] = 2; 

サブルーチン:私は$_[0]を試してみました

sub mySubroutine 
{ 

} 

、および@_が、サブルーチンに渡される変数を正しく取得していないようです。

+1

$ nameまたは$ ageは表示されません。どのようにサブルーチンを呼び出していますか? – m0skit0

+5

あなたのサンプルコードはいくつかの変数を失いますが、最も重要なのは関数呼び出しです。 – Christoph

+0

あなたはこの 'mySubroutine($ name、$ age、\ @ multidimensional_array)'のように書いていましたか? –

答えて

24

これを行う方法はいくつかあります(Perlのほとんどのもののように)。参照によって配列を渡したが、その後、あなたがそれを編集する場合、元の変更を避けるために、それのコピーを作成し

sub mySubroutine 
{ 
    # Get passed arguments 
    my ($name, $age, $refList) = @_; 

    # Get the array from the reference 
    my @list = @{$refList}; 
    # Good to go 
} 

# You need to pass @list as reference, so you 
# put \@list, which is the reference to the array 
mySubroutine($name, $age, \@list); 
+3

特にコピーを必要としない限り、コピーを作成するよりも、サブ配列内の配列参照を使用する方が良いです。 –

+0

合意しましたが、OPが元の配列を変更したいかどうかわかりません。 – m0skit0

+0

素晴らしい!これはちょうど私がそれを望む方法で動作します!ありがとう! – user2114919

4

もう一つの方法は、私は個人的に、このようにそれを行います。

sub mySubroutine 
{ 
    ## Retrieve name 
    my $name = shift; 

    ## Retrieve age 
    my $age = shift; 

    ## Retrieve list reference 
    my $refList = shift; 

    ## De-reference the list's scalar 
    my @list = @{$refList}; 
    # Good to go 
} 

## Function call 
mySubroutine($name, $age, \@list); 

perlsub(Perlサブルーチン)を参照してください。

+1

このようにしているのであれば、より良いことです。 'my $ name = shift;私の年齢=シフト; '...等 – m0skit0

+0

変更を加えました。 –

5

別のオプションは、限り、あなたは唯一の配列を渡しているように、最後の要素として値で、通常はそれを渡すことです:

sub scalars_and_one_array { 
    my $name = shift; 
    my $age = shift; 

    foreach my $element (@_) 
    { 
     # Do something with the array that was passed in. 
    } 
} 

scalars_and_one_array($name,$age,@array); 

はしかし、配列の任意の追加のコピーを避けるために、最も効率的ですサブ内の参照のみを使用します。これは、サブの配列の変更がオリジナルに影響することを意味します。

sub array_by_ref { 
    my $array_ref = shift; 

    foreach my $element (@$array_ref) 
    { 
     # Changing $element changes @original_array! 
    } 
} 

array_by_ref(\@original_array); 
+0

もちろん、これは1つの配列を渡している場合にのみ機能します。 – m0skit0

関連する問題