2

検討:

sub abc()
{

}

abc(@array, $a);

サブルーチンにアクセスする@arrayにはどうすればよいですか?$aabc()

$_[0]とについては知って$_[1]いますが、配列に使用できるかどうかはわかりませんでした。

4

4 に答える 4

6

@_配列を使用してサブの引数にアクセスします。最初の引数は$_[0]、2番目の-$_[1]などです。この特定のケースでは、配列はその要素のリストに展開されます。したがって、isで$_[0]あり、これらすべての要素の後、の最後の要素はの値になります。$array[0]$_[1]$array[1]@_$a

リストコンテキストで配列を使用するときに常に発生する展開を回避したい場合は、代わりに配列への参照を使用してください。配列とハッシュへの参照は、を使用して作成されます\。したがって、次のように関数を呼び出します。

abc(\@array, $a);

その後、への$_[0]参照が@arrayあり、$_[1]になります$a。参照を介して配列要素にアクセスするには、->演算子を使用します。$_[0]->[2]と同じ$array[2]です。->実際には、角かっこの間にある限りドロップすることもできるので、同様$_[0][2]に機能します。perlrefのリファレンスの詳細を参照してください。

于 2012-10-18T09:04:04.523 に答える
6

2つのオプションがあります。

  1. 最初にスカラー変数を渡します(汚い方法)

    abc($a, @array);
    

    次に、サブルーチンでパラメータを次のように受け取ります

    my ($a, @array) = @_;
    
  2. 配列変数の前に円記号を追加して、配列を参照として渡します(推奨)

    abc(\@array, $a);
    

    次に、サブルーチンでパラメータを次のように受け取ります

    my ($array_ref, $a) = @_;
    

    そして、$array_refを逆参照します

    my @array = @$array_ref;
    

perlrefに関する詳細情報。

于 2012-10-18T09:19:15.143 に答える
2

他の回答は、2つの基本的なアプローチを説明しました。ただし、2つの間に大きな違いがあることに注意することが重要です。参照によって配列を渡す場合、それに加えた変更は元の配列も変更します。次に例を示します。

use warnings;
use strict;

my @array = (1, 2, 3, 4, 5);

sub by_ref
{
    my $array_ref = $_[0];
    @$array_ref = (0, 0, 0);
    print "Array inside by_ref: @$array_ref\n";
}

sub by_val
{
    my @array_copy = @_;
    @array_copy = (0,0,0);
    print "Array inside by_val: @array_copy\n";
}

by_val(@array);

print "Original array after calling by_val: @array\n";

by_ref(\@array);

print "Original array after calling by_ref: @array\n";

参照渡しを行う場合は、この動作を念頭に置く必要があります。サブで行われた変更が元の配列に影響を与えたくない場合は、参照される配列のコピーを作成します。

于 2012-10-18T11:37:51.543 に答える
0

Oleg V. Volkovが述べたように、配列の代わりに配列参照を渡すと便利です。

sub abc()
{
    my ( $array, $a ) = @_; #receiving the paramters
    my @arr = @{$array}; # dereferencing the array
}

abc(\@array,$a);
于 2012-10-18T09:11:17.360 に答える