我有以下代码段:
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
有什么想法吗?
答案 0 :(得分:5)
为您的解决方案尝试这种方式
tmp.collect! do |val|
if val.present? # or unless val.nil?
val.gsub(line_sub, "")
end
end
答案 1 :(得分: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
答案 2 :(得分:1)
您正在阅读的其中一行是空的,或者它不包含'='
个字符。
#Then, you get either
tmp[0], tmp[1] = ["only one element"]
# => tmp[1] = nil
#or
tmp[0], tmp[1] = []
# both are nil.
答案 3 :(得分:1)
添加一个这样的条件
tmp.collect! do |val|
if !val.nil?
val.gsub(line_sub, "")
end
end
答案 4 :(得分:0)
如果该行中“=”的每一侧都应该有一个值,例如"foo=bar"
而不是"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