0

次の C# コードでは:

int[] X = new int[2];
X[0] = 1;
X[1] = 2;
int[] Y = X;
X[1] = 3;

これが実行された後、Y[1] も 3 になります。操作 Y = X はクローンを実行せず、X が指している参照またはポインターを Y に割り当てるためです。

Perl 5 で同じ操作を試みた場合:

my @X = (1, 2);
my @Y = @X;
$X[1] = 3;

C# とは異なり、Y[1] は 3 ではなく 2 です。これは、Perl が @Y = @X 操作の後に配列のコピーを作成することを示しています。

それで、私の質問は - 両方が同じデータを指すように、別の Perl 配列の参照で Perl 5 配列を割り当てまたは初期化する方法はありますか? 私はすでに参照について知っており、配列への参照を逆参照しようとしましたが、それもコピーを作成します。また、配列への参照を使用すると、私がやろうとしていることのほとんどが解決されることもわかっているので、参照の操作方法を示す回答は必要ありません。

4

4 に答える 4

4

C# プログラムで参照を使用していますが、Perl プログラムでは使用していません。Perl で参照を使用する場合も同じように機能します。

my $X = [ 1, 2 ];
my $Y = $X;
$X->[1] = 3;
print "@$Y\n";  # 1 3

また

my @X = ( 1, 2 );
my $Y = \@X;
$X[1] = 3;
print "@$Y\n";  # 1 3

エイリアスを作成することもできます。

use Data::Alias qw( alias );

my @X = ( 1, 2 );
alias my @Y = @X;
$X[1] = 3;
print "@Y\n";  # 1 3
于 2012-10-18T16:14:19.170 に答える
2

特定の名前付き変数への参照を作成する方法は、次のようにバックスラッシュを使用することです。

my @x = (1,2);
my $y = \@x;            # create reference by escaping the sigil

$y->[1] = 3;            # $x[1] is now 3
for ( @$y ) { print }   # how to reference the list of elements

無名配列を使用して参照を作成することもできます。

my $x = [1,2];          # square brackets create array reference
my $y = $x;             # points to the same memory address

参照はスカラー値なので$y、あなたの場合になります。配列参照を配列に入れると、2 次元配列が得られます。これは、将来の参照のために知っておくと便利です。例えば:

my @two = (\@x, \@y);                 # $two[0][0] is now $x[0]
my @three = ( [1,2], [3,4], [4,5] );  # using anonymous arrays
于 2012-10-18T16:10:10.403 に答える
1

Perl では、配列はポインターではありません。

\演算子を使用して配列の参照を取得できます。

my @array = ( 1, 2 );
my $array_ref = \@array;

$array_refその後、元の配列を指します(Cのように)

${$array_ref}[0] = 3

元の配列の最初のセルを変更します (つまり、$array[0]3 になります)

于 2012-10-18T16:13:16.760 に答える
1

これをやってみてください:

my @X = (1, 2);
my $ref = \@X;        # $ref in now a reference to @X array (the magic is `\`)
$ref->[0] = "foobar"; # assigning "foobar" to the first key of the array
print join "\n", @X;  # we print the whole @X array and we see that it was changed
于 2012-10-18T16:10:39.257 に答える