簡體   English   中英

了解Perl數組中的引用以及如何訪問數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM