傳遞給函數時,如何解引用數組數組?如何在Perl中取消引用數組數組?
我這樣做是這樣的:
my @a = {\@array1, \@array2, \@array3};
func(\@a);
func{
@b = @_;
@c = @{@b};
}
其實我想要的陣列@c
應包含@array1
,@array2
,並@array3
地址。
傳遞給函數時,如何解引用數組數組?如何在Perl中取消引用數組數組?
我這樣做是這樣的:
my @a = {\@array1, \@array2, \@array3};
func(\@a);
func{
@b = @_;
@c = @{@b};
}
其實我想要的陣列@c
應包含@array1
,@array2
,並@array3
地址。
my @a = {\@array1, \@array2, \@array3};
上面是具有單個部件的陣列 - >一個散列含有:
{ ''.\@array1 => \@array2, ''.\@array3 => undef }
因爲隨着在散列密鑰,Perl的脅迫提及@array1
成一個字符串。 Perl允許將一個標量哈希引用分配給一個數組,因爲它「被理解」爲你想要一個數組,其中第一個元素是你賦給它的標量。
您創建一個數組的數組,就像這樣:
my @a = (\@array1, \@array2, \@array3);
然後在你的功能,你會解開他們,就像這樣:其
sub func {
my $ref = shift;
foreach my $arr (@$ref) {
my @list_of_values = @$arr;
}
}
還是有一些變化,好比說一個地圖將是最簡單的表達式:
my @list_of_entries = map { @$_ } @$ref;
在您的示例中,@c
作爲列表地址與正確構建的@a
完全相同。
應該
func {
$b = shift;
}
,如果你傳遞一個參考。希望有助於一些。
閱讀perlreftut文檔。
編輯:其他人指出我最初錯過了一個好點。在@a的初始化中,您可能是指@a = (...)
(創建包含引用的數組)或$arrayref = [...]
(創建對數組的引用),而不是{...}
(創建對散列的引用)。這篇文章的其餘部分假設你有@a = (...)
版本。
由於您將一個參數(對@a
的引用)傳遞給func
,因此@_是包含該引用的列表。你可以得到引用,然後取消對它的引用這樣做:
sub func {
my $arrayref = shift;
my @c = @{$arrayref};
}
或者在一個行,它看起來像:
sub func {
my @c = @{shift()};
}
(如果你沒有在func(\@a)
用反斜槓,@_將等於@a
,這是三個引用的數組。)
您可能需要閱讀perldoc perlreftut
,perldoc perlref
和perldoc perldsc
你可以說:
sub func {
my $arrayref = shift;
for my $aref (@$arrayref) {
print join(", ", @$aref), "\n";
}
}
my @array1 = (1, 2, 3);
my @array2 = (4, 5, 6);
my @array3 = (7, 8, 9);
my @a = \(@array1, @array2, @array3);
func \@a;
或更簡潔:
sub func {
my $arrayref = shift;
for my $aref (@$arrayref) {
print join(", ", @$aref), "\n";
}
}
func [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ];
嗨,非常感謝...它運作良好..非常感謝你 – jack 2010-10-14 12:04:36
我不認爲'@a = {\ @數組1 ,\ @ array2,\ @ array3}'做你認爲它的作用。 – mob 2010-10-13 15:05:34
在這麼幾行代碼中有很多誤解。 – 2010-10-13 15:10:27
Perl有引用,而不是指針(如C)。你無法獲得變量的地址,也不需要。 (爲了任何足夠熟練的Perl黑客誰覺得有必要指出的是,這是不是100%準確的信息:不要在OP是混亂的夠多了。) – 2010-10-13 15:16:09