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に関する限り、これらは2つの異なる変数です。として宣言するか、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 に答える