2

我有以下代码片段:

   line_sub = Regexp.new(/\s+|"|\[|\]/)
   tmp = Array.new
    # reading a file
   while line = file.gets
     ... 
     tmp[0],tmp[1] = line.to_s.scan(/^.*$/).to_s.split('=')
    #remove unwanted characters
     tmp.collect! do |val|
       val.gsub(line_sub, "")
     end
    ...
   end

但是当我运行代码时,我得到了错误:

 undefined method `gsub' for nil:NilClass (NoMethodError)

这里似乎有问题:

tmp.collect! do |val|
 val.gsub(line_sub, "")
end

任何的想法?

4

5 回答 5

6

尝试这种方式为您的解决方案

tmp.collect! do |val|
  if val.present?   # or unless val.nil?
    val.gsub(line_sub, "")
  end
end
于 2012-11-09T06:31:11.310 回答
2

像这样添加一个条件

     tmp.collect! do |val|
        if !val.nil?
           val.gsub(line_sub, "")
        end
     end
于 2012-11-09T06:35:53.167 回答
1

它意味着tmp[0]和/或是。您的tmp[1]nil

line.to_s.scan(/^.*$/).to_s.split('=')

没有按预期工作。最好检查那部分的结果。

顺便说一句,line.to_s.scan(/^.*$/).to_s没有意义。如果要处理文件的每一行,请执行

file.each_line do |l|
  ...
  l ...
end
于 2012-11-09T06:24:45.570 回答
1

您正在阅读的其中一行是空的,或者它不包含'='字符。

#Then, you get either
tmp[0], tmp[1] = ["only one element"]
# => tmp[1] = nil

#or
tmp[0], tmp[1] = []
# both are nil.
于 2012-11-09T06:28:54.780 回答
0

如果该行中“=”的每一侧都应该始终有一个值,例如"foo=bar"和 not "foo=",请尝试以下操作:

line.match(/(.+)=(.+)/ do |match|
  # do whatever you need with the match
  # if there is no match this block won't be executed
  tmp = match[1..2]
  tmp.map! do |string|
    string.gsub(/[\s"\[\]/, "")
  end
end
于 2012-11-09T06:47:48.593 回答