[英]Understanding referencing within perl arrays and how data is accessed
我可以在perl及其如何處理其數組方面提供一些幫助。 (很久以前)我曾經使用php,java,js等做過很多編碼(黑客會是一個更好的描述,永遠不會做得很好),但是由於種種原因,我在項目中使用了perl,我正在努力找出為什么我很難找到數組。
例如,以下代碼:
@inflightsequences=([1,6,[["SRCIP","1.2.3.4"],["DSTIP","5.6.7.8"]]],[2,2,[["SRCIP","1.2.3.4"],["DSTIP","5.6.7.8"]]]);
foreach (@inflightsequences) {print Dumper @_};
數組的定義在哪里創建(使用Dumper打印)
$VAR1 = [
1,
6,
[
[
'SRCIP',
'1.2.3.4'
],
[
'DSTIP',
'5.6.7.8'
]
]
];
$VAR2 = [
2,
2,
[
[
'SRCIP',
'1.2.3.4'
],
[
'DSTIP',
'5.6.7.8'
]
]
];
(注意,從現在開始,我將使用VAR1和VAR2引用數組中的數據,因此無論Dumper實際調用的是什么,它都清楚我要引用哪個塊)
...但是當我希望它循環兩次並先在VAR1中然后在VAR2中輸出內容時,foreach絕對不會輸出任何內容。 然而
print Dumper @inflightsequences[0];
print Dumper @inflightsequences[1];
確實按預期打印出VAR1和VAR2。
然后我從@inflightsequences數組中提取第一項
@dataset = shift(@inflightsequences);
我希望print $dataset[1]
在VAR1中打印出第一個值(1),而print $dataset[2]
打印第二個值(6),但沒有,要達到我期望的print $dataset[0][0]
並print $dataset[0][1]
。 為什么要多加[0]?
因此,我感到非常困惑。
謝謝
- 克里斯
@inflightsequences是數組引用的數組,因此
$r=shift(@inflightsequences)
print $r->[0]
將顯示1
和
print $r->[1]
將顯示6
在做
@dataset=shift(@inflightsequences)
根據移位的結果制作一個數組。 因此,它是一個包含一個元素的數組,即移位結果,可通過$ dataset [0]進行訪問。 $ dataset [0]-> [1]將給出6,例如
使您感到困惑的是,Perl數組的元素始終是標量值。 您可以通過使用標量的引用來創建數組的數組。
您可以通過建立命名數組並獲取其引用來創建數組引用
my @data = ( 'a', 'b', 'c' );
my $array_ref = \@data;
或通過創建匿名數組
my $array_ref = [ 'a', 'b', 'c' ];
兩者之間的唯一區別是,在第一種情況下,可以通過名稱@data
以及引用$array_ref
來訪問數據。 要通過引用訪問數組的元素,請使用箭頭運算符,因此
$array_ref->[0]
是相同的
$data[0]
foreach
循環不輸出任何內容的原因是,您正在轉儲@_
數組的內容,該內容以前從未提到過,並且為空。 @_
是在子例程中設置為調用該子例程時傳遞的實際參數的數組。 否則它沒有用。
記住數組元素是標量 ,並且如果您不指定循環控制變量,那么Perl將使用$_
,您應該寫的是
foreach (@inflightsequences) { print Dumper($_) }
或更確切地說,
print Dumper($_) for @inflightsequences
同樣適用於您的陳述
@dataset = shift(@inflightsequences)
同樣,由於@inflightsequences
的內容是標量,因此將刪除第一個數組引用並將其放入@dataset
,該數據集現在只是一個包含數組引用的單元素數組。 這意味着您已經將$inflightsequences[0]
移至$dataset[0]
,現在等於
[1, 6, [ ["SRCIP", "1.2.3.4"], ["DSTIP", "5.6.7.8"] ] ]
不要忘了方括號創建了對匿名數組的引用。 因此,就像上面的$array_ref->[0]
,您可以使用$dataset[0]->[0]
訪問該數組的第一個元素。 而且由於Perl允許您刪除成對的方括號(如果使用哈希,則使用大括號)之間的箭頭運算符,因此可以將其收縮為$dataset[0][0]
,該值恰好是值1。
希望對您有所幫助。 您最好閱讀perlref
並進行一些實驗。 注意, Data::Dump
模塊產生的輸出要比Data::Dumper
更好,但是您可能需要安裝它,因為它不是核心模塊。 一旦安裝,代碼將如下所示
use Data::Dump;
dd \@inflightsequences;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.