我有類似于下面的代碼:
my @array1 = (); #2d array to be used
my $string1 = "blank1";
my $string2 = "blank2";
my $string3 = "blank3";
my @temp = ($string1, $string2, $string3);
push (@array1, \@temp);
我分配字串然后將它們放入陣列的原因是因為它們處于回圈中并且值在回圈中得到更新(@array1 未在回圈中宣告)。
當我運行我的程式時,它只給了我一個陣列的參考,而不是一個實際的二維陣列。如何讓它將內容列印為 2D 陣列而不是作為參考或展平為 1D 陣列?
我想要一個這樣的輸出,[[blank1, blank2, blank3],....]所以我可以像訪問它一樣$array1[i][j]
uj5u.com熱心網友回復:
陣列只能有元素的標量。因此,這包括對陣列的參考,例如,使我們能夠構建復雜資料結構的東西。請參閱perldsc,Tom 的 Perl Data Structure Cookbook。
這些(“二級”)陣列的元素是通過解參考來訪問的,陣列的第二個元素也是如此$array1[0]->[1],參考的是頂級陣列的第一個元素(@array1)。或者,為方便起見,也允許使用更簡單的語法: $array1[0][1].
如果我們想要一個二級數??組的所有元素的串列,那么用 取消參考它@,比如:
my @l2 = @{ $array1[0] }; # or, using
my @l2 = $array1[0]->@*; # postfix dereferencing
第二行是一種新的語法,稱為postfix dereferencing,自 v5.24 起穩定。它為我們提供了與我們鉆取單個元素時相同的邏輯來獲取所有元素,方法是從左到右一直作業。因此->@*,要獲取 arrayref、->%*hashref (等)的元素串列。參見例如perl.com 文章和Effective Perler文章。
當涉及到使用參考構建的多維結構時,需要注意一件事。有兩種不同的方法來創建它們:通過使用對現有的、命名的、變數的參考
my @a1 = 5 .. 7;
my %h1 = ( a => 1, b => 2 );
my @tla1 = (\@a1, \%h1);
或者通過使用匿名的,其中 arrayrefs 由構造[]并且 hashrefs 由{}
my @tla2 = ( [ 5..7 ], { a => 1, b => 2 } );
記住這一點很重要。在第一種情況下,可以使用對陣列攜帶的變數的參考來改變它們——如果我們改變元素,@tla1那么我們就會改變參考的變數
$tla1[0][1] = 100; # now @a1 == 5, 100, 7
@tla1此外,在頂級陣列中也可以看到使用 in 參考更改變數。
使用匿名陣列和散列時,@tla情況并非如此,因為@tla訪問的是一組獨立的資料,這些資料不能以任何其他方式訪問(和更改)。這兩種都有它們的用途。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/498061.html
上一篇:Perl:僅當陣列的foreach回圈沒有要處理的元素時才進行進一步處理(foreach回圈的最后一次迭代已打開)
