3

我还是红宝石的新手。由于某种原因没有看到我的阵列。我在 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

一个示例 test.log:

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

我怎样才能像这样得到一个数组?

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

2 回答 2

5

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

编辑:因为评论很受欢迎,我会补充一点,Ruby 全局变量(即那些以 开头的$)可能会导致非常难以调试的情况,我会劝阻你不要使用它们。我无法想到在不可能使用更清洁的解决方案的情况下使用全局的情况。

于 2012-05-16T20:24:08.933 回答
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
于 2012-05-16T21:55:04.500 回答