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在你的情况下。如果将数组引用放入数组中,则会得到一个二维数组,便于将来参考。例如:

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

尝试这样做:

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 回答
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 回答