Ruby动态数组:未定义的局部变量或方法`s'for main:Object(NameError)

mhz*_*mhz 3 ruby arrays dynamic

我还是红宝石的新手.我的阵列由于某种原因没有出现.我在irb中测试了我的代码逻辑,它似乎工作正常,但是当我在if语句中使用它时,它会打破标题中的错误.

$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
Run Code Online (Sandbox Code Playgroud)

一个示例test.log:

aaaaaaaaaaaaaaaaaa
m1
ggg
p1
p2
p3
p4
oooooooooooooo
m2
p1
p2
p3
p4
p5
gggggggggggggg
m3
p1
kkkkkkkkkkkk
m4
m5
llllllllllllll
Run Code Online (Sandbox Code Playgroud)

我怎么能得到像这样的阵列?

[[m1,p1,p2,p3,p4], [m2,p1,p2,p3,p4,p5], [m3,p1], [m4], [m5]]
Run Code Online (Sandbox Code Playgroud)

x1a*_*1a4 5

您已将数组声明为$s,但正尝试将其作为s.就Ruby而言,这是两个不同的变量.您应该将其声明为s = []或始终将其作为$s例如$s << [$1].

编辑:因为评论是如此受欢迎,我将添加Ruby全局变量(即那些开头的$)可能导致非常难以调试的情况,我会阻止你使用它们.我无法想到使用全球无法获得更清洁解决方案的情况.

  • 还应该注意的是,使用全局变量(以`$`开头的变量)是不受欢迎的. (4认同)