12

次の変数をサブルーチンmySubroutineに渡し、$name, $age次にこの多次元配列に渡します。

$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;

サブルーチン:

sub mySubroutine
{

}

$_[0]、、を試し@_ましたが、変数がサブルーチンに正しく渡されていないようです。

4

3 に答える 3

27

これを行うにはいくつかの方法があります (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);
于 2013-02-27T10:41:30.360 に答える
6

もう 1 つのオプションは、配列を 1 つだけ渡す限り、通常は最後の要素として値で渡すことです。

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);
于 2013-02-27T10:56:05.200 に答える
6

もう 1 つの方法は、参照によって配列を渡しますが、編集時に元の配列が変更されないようにコピーを作成します。

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 サブルーチン) を参照してください。

于 2013-02-27T10:44:21.110 に答える