2012-05-16 30 views
3

我還是新的紅寶石。 我的數組出於某種原因沒有被看到。 我在irb中測試了我的代碼邏輯,它似乎可以正常工作,但是當我在if語句中使用它時,它會打破標題中的錯誤。Ruby動態數組:未定義的局部變量或方法's'爲主:對象(NameError)

$s = [] 

i = 0 

File.open("test.log").each do | l | 
    if l =~ /(m.)/ 
     s << [$1] 
     i=i+1 
    end 

    if l =~ /(p.)/ 
     s[i-1] << $1 
    end 

end 

s.each do |g| 
    p g 
end 

一個例子test.log中:

aaaaaaaaaaaaaaaaaa 
m1 
ggg 
p1 
p2 
p3 
p4 
oooooooooooooo 
m2 
p1 
p2 
p3 
p4 
p5 
gggggggggggggg 
m3 
p1 
kkkkkkkkkkkk 
m4 
m5 
llllllllllllll 

我怎樣才能最終要與數組S,像這樣?

[[m1,p1,p2,p3,p4], [m2,p1,p2,p3,p4,p5], [m3,p1], [m4], [m5]] 
+0

+0不檢查您發佈的代碼是否提供了與問題中所述相同的錯誤消息。 –

+0

已修復。沒有想到這是件大事 – mhz

回答

5

聲明瞭數組作爲$s,但正試圖訪問它s。就Ruby而言,這是兩個不同的變量。您應該將其聲明爲s = []或者始終以$s的身份訪問它,例如, $s << [$1]

編輯:因爲評論如此流行,我會添加Ruby global variables(即那些以$開頭的文字)可能會導致非常難以調試的情況,並且我會阻止您使用它們。我無法想象使用全球性解決方案無法實現的情況。

+4

還應該指出,使用全局變量(那些以'$'開頭的變量)是不被接受的。 –

+0

謝謝!良好的捕獲,不知道它:) *拉一些頭髮*我意識到我的主要錯誤是在正則表達式。原始代碼有更復雜的正則表達式,我錯過了它。 – mhz

+0

不過,下劃線錯誤從哪裏來? – echristopherson

1

每次點擊m行時,應該在主陣列中初始化一個新的子陣列。如果您點擊一條p行,則會追加到該索引。

index = -1; 
array = [] 
File.open("test.log").each do |line| 
    if line =~ /m./ 
    index = index + 1 
    array[index] = [] 
    array[index] << line 
    end 

    if line =~ /p./ 
    array[index] << line 
    end 
end 
+0

謝謝羅恩。儘管我得到了上面的答案。 – mhz

相關問題