2012-10-18 44 views
0

在下面的C#代码:在Perl中将一个数组的地址分配给另一个可能吗?

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

此执行后,Y [1]也将3由于操作Y = X并不做一个克隆,而是分配什么X指向的引用或指针如果相同的操作的Perl 5下试图在为Y.

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

不同于C#,Y [1]不为3,但仍2,这表明的Perl使得数组的副本在@Y = @X操作之后。

所以,我的问题是 - 是否有任何方法来分配或初始化一个Perl 5数组与另一个Perl数组的引用,使他们都指向相同的数据?我已经知道引用,并尝试解引用对数组的引用,但也是复制。我也知道使用对数组的引用将解决我正在尝试做的大部分工作,所以我不需要任何显示如何使用引用的答案。

回答

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 
+0

如果使用复杂的数据结构 - 例如包含数组作为值的哈希表数组。可以使用别名来获取这些单独结构中的每一个,包括散列表值中使用的数组?在其他语言中,这可以轻松完成。如果这在Perl中不容易完成,那么它意味着复杂的数据结构应该使用引用。例如,上面的数据结构可以被定义为包含对数组引用值的散列引用数组。 –

+0

@Bob布莱恩,你不能有数组作为哈希的值。哈希值只能是标量,比如对数组的引用。 – ikegami

+0

我对Perl还是一个新手,所以我可能会对此错误。但是,根据编程Perl第4版:第9章:数据结构在数据结构下的数组结构(Hashes of Arrays)主题显示了如何将数组添加到散列的几个示例:%Hoa(flinstones => [“fred”,“barney”] ,jetsons => [“george”,“jane”,“elroy”],simpsons => [“homer”,“marge”,“bart”],);如果这段代码没有创建数组的散列,那么你能解释一下它在做什么。 –

2

是通过使用反斜线像这样创建到特定的命名变量的引用的方式:

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

参考:

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 

您也可以通过使用匿名阵列创建参考是一个标量值,所以你的情况应该是$y。如果将数组引用放入数组中,则会得到一个二维数组,这对于将来的参考很方便。例如: -

my @two = (\@x, \@y);     # $two[0][0] is now $x[0] 
my @three = ([1,2], [3,4], [4,5]); # using anonymous arrays 
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 
1

Perl中的数组不是指针。

你可以得到的阵列与\操作者参考:

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

然后$array_ref将指向原始阵列(如在C)

${$array_ref}[0] = 3 

将改变的第一单元原始数组(即,$array[0]将为3)

相关问题