2012-10-18 83 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)

相關問題