2013-05-30 29 views
1

我是一個完全的Perl新手,但仍然無法相信我無法弄清楚所有我通過在線閱讀的信息,但是,我燒了太多時間,並且正在遭受阻塞在此刻。希望學會根據我的現實生活中的例子東西...有趣的數組陣列

好吧,我想我有一個數組的數組,這樣創建:

my @array1 =(); 
my @array2 =(); 
my $ctr1 = 0; 
my $col; 
[sql query] 
while(($col)=$sth->fetchrow_array()) { 
    $array1[$ctr1]=$col; 
    $ctr1++; 
} 

print STDERR "@array1"; 

##results in 10 rows, a mac address in each 
##00:00:00:00:00:00 00:11:11:11:11:11 22:22:22:22:22:22 33:33:33:33:33:33 ... 

現在我做的另一個查詢。在循環瀏覽結果時,我正在查找這10個mac地址。當我找到一個,我添加一行array2與mac和序列號累積到點,如下所示:

[sql query] 
while(($col)=$sth->fetchrow_array()) { 
    $ctr2++; 
    if(my ($matched) = grep $_ eq $col, @array1) { 
    push(@array2, ($col,$ctr2)); 
    } 
} 

print STDERR "@array2"; 

##results in 10 rows, a mac address and an integer in each 
##00:00:00:00:00:00 2 00:11:11:11:11:11 24 22:22:22:22:22:22 69 33:33:33:33:33:33 82 ... 

現在很容易的部分。我想循環訪問array2,獲取用作sql查詢一部分的mac地址。這就是問題所在。儘管我的工作已經完成,但我對於自己的工作卻一無所知,但我無法回到這一點。無知絕對不是幸福。

當我通過array2循環時,基於語句的不同形式,我得到了大量錯誤。一個我認爲是正確與錯誤消息一起如下...

my $ctr3 = 0; 
foreach $ctr3 (@array2) { 
    my $chkmac = $array2[$ctr3][0]; <--- gacks here with the error below - line 607 
    [SQL query] 


[Thu May 30 14:05:09 2013] [error] Can't use string ("00:66:55:77:99:88") as an ARRAY ref while "strict refs" in use at /path/to/test.cgi line 607.\n 

我相信這個問題是我的數組的數組是不是一個數組的數組。如果是的話,它會像編碼一樣工作,或者我從閱讀中想到......這就是說,我無法理解我正在處理的事情。這將是一個頭巴掌我很確定,但我很難過....請幫忙嗎?

TIA Ø

+1

如果你不知道你已經結束了什麼數據結構了 - 如果你不習慣Perl的數據結構,這是不尋常! - 優秀的Data :: Dumper模塊可以用來可視化你最終的結果。只是'使用數據::自卸車;'和'打印自卸車(\ @my_array);'' –

+0

我是一個總的Perl的福利局,但仍然無法相信我能不明白這out' - 我用的Perl多年,但是這種情況在我看來還是比我想承認的要多得多 – djf

+0

看看[Perl教程](http://perldoc.perl.org/index-tutorials.html)。有一個名爲[Mark關於參考文獻的非常簡短的教程](http://perldoc.perl.org/perlreftut.html),它將真正地解釋參考文獻如何工作。唯一的問題是,一旦你讀了它,你對參考文獻的理解就會變得非常清楚,你將會使用最複雜而難以維護的參考文獻。解決方案是閱讀非常優秀的[面向對象教程](http://perldoc.perl.org/perlobj.html)。有趣的是隻需點擊一下! –

回答

2

對於要使用數組引用的數組數組,

push @array2, [$col, $ctr2]; 

訪問數組引用中的元素時,您需要使用->運算符。另外,在循環數組時,不需要索引回同一個數組。所以最後一部分看起來更像:

foreach $ctr3 (@array2) { 
    my $chkmac = $ctr3->[0]; 
    .... 
+0

好的;我錯過了推送問題。 –

+0

推送問題?我認爲那是一樣的。我現在看到了差異。我一直試圖使方括號工作,但我從來沒有夢想過括號是問題。我從來沒有看到過一個例子!讓我們再試一次... –

+0

尤里卡!有趣的是,如果你做得對,它是如何運作的!非常感謝你們。我非常感謝你的幫助和免費的課程! :) –

1

當你做對foreach那裏,$ctrl3不會有指數,它會具有價值。所以你應該只需要做$ctrl3->[0]。請注意0​​將數組引用取消引用(@array2實際上是數組引用的數組)。

編輯:正如AKHolland指出的,@array2實際上不是一個數組引用數組,雖然這就是它應該是。你還需要改變:

push(@array2, ($col, $ctr2)); 

push(@array2, [$col, $ctr2]); 

這使得數組引用,而不是一個列表。在這種情況下的列表只是摺疊成push的常規參數,這意味着您將兩個單獨的字符串推入@array2

0

你是正確的,你的數組的數組不是數組的數組,因爲在Perl中有沒有這樣的事情。那麼你有什麼呢?有兩種方法可以看到。

首先,當你打印@array2,你拿出一個交替MAC和計數,用空格分隔組成的字符串。由於空格表示數組元素之間的劃分,所以我們可以推測,我們得到的是單個異構元素陣列,例如元素0是MAC,元素1是計數,元素2是另一個MAC , 等等。

另一個角度看是看@array2是如何構建的:

push(@array2, ($col,$ctr2)); 

the documentation for push,我們發現,push ARRAY LIST作品通過附加的LIST的元素的ARRAY結束。這具有將列表平坦化到數組中的效果,使得其作爲列表的原始身份丟失。當Perl期望一個列表時,你可以添加所有你想要的括號。

那麼,你如何達到你想要的效果? The List-of-Lists documentation有一個詳細的處理,但簡單的答案是你做出數組引用的列表。數組引用是標量,因此是數組中的合法元素。但是他們保留他們的身份作爲數組引用!

匿名數組引用構造是方括號[]。爲了推含有元素$col$ctr2到的@array2結束數組引用,只需做:

push(@array2, [$col, $ctr2]); 

你用於訪問陣列基準在-AN-的特定元素寫的代碼數組現在起作用。但是,由於我已經寫了一些關於這個主題的段落,讓我最後解釋一下最初的錯誤,以及如何改變push語句突然使其工作。

表達$array2[$ctr3][0]有時寫作$array2[$ctr3]->[0]澄清它實際上做什麼。它的作用是取$array2[$ctr3]的值,並將其視爲數組引用,取其0元素。如果我們把$ctr30(因爲這將是在循環的頂部)$array2[$ctr3]值是第一要素,00:00:00:00:00:00。當你隨後要求Perl將00:00:00:00:00:00當作數組引用時,Perl會因爲不知道如何將字符串視爲數組引用而死亡。

當代替$array2[$ctr3]值是一個數組引用,因爲這是構建時,你推到@array2什麼,Perl是能夠做到爲你問,解引用數組引用並查看結果數組的元素0,其價值碰巧是00:00:00:00:00:00