检查数组元素是否在文件中使用

时间:2014-05-21 10:24:46

标签: ruby arrays

我有以下代码试图检查是否正在使用未使用的数组元素:请纠正我错在哪里。我打开myclass.css并遍历每一行并添加所有以数组中的#标签或点开头的选择器,之后我拆分数组元素并删除重复项。删除重复项后,我使用此列表检查它们是否在complied.js文件中使用,如果它们未被使用,我将添加到新数组。

list_selectors = []
file = File.open("myclass.css") 
file.each_line do |line|
    list_selectors << line.split(' {')[0] if line.start_with? '.' or line.start_with? '#' 
end 
while line = file.gets
    puts line 
end
i = 0 
    while i < list_selectors.length
        puts  "#{list_selectors[i]}"
        i += 1
    end
list = []
list_selectors.each { |x| 
    list.push(x.to_s.split(' ')) 
    }

list_selectors = list.flatten
# puts "***************splitted ******************************"
puts list_selectors
# puts "*********** split before dot ************************"
list_selectors.map! { |e| e[/[.#].*/]}

puts list_selectors

# puts "**************remove duplicates ********************"

list_of_classes_ids = list_selectors.uniq
list_selectors.uniq!
puts list_selectors
# puts "^^^^^^^^^^^^^^^^^not found ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"


for ic in 0..list_of_classes_ids.length
    puts " #{list_of_classes_ids[ic]}"
end

selectors_not_found = []

while nf = File.readlines("compile.js")
    if !list_of_classes_ids[ic]
        selectors_not_found << nf
else
    puts "Exists" 
end
end

puts "////////*********************************////////////////"

puts selectors_not_found

请协助 当我运行上面的代码时,它会给出错误消息readline:无法从clean.rb分配内存(NoMemoryError):44:<main>

1 个答案:

答案 0 :(得分:0)

你的问题在这里:

while nf = File.readlines("compile.js")
  if !list_of_classes_ids[ic]
    selectors_not_found << nf
  else
    puts "Exists" 
  end
end

对于每次迭代,您将文件读取到新的字符串数组,将其添加到selectors_not_found数组,然后再次打开文件(每次填充内存)... File.readlines永远不会返回一个假的值,所以它一直持续到你的内存不足为止。

我不确定此代码的意图(例如ic这里的值是什么?),但假设您想迭代文件中的,第一步是:

File.readlines("compile.js").each do |nf|
  if !list_of_classes_ids[ic]
    selectors_not_found << nf
  else
    puts "Exists" 
  end
end

这段代码可能仍然不能正常工作,因为它没有检查任何合理的东西,但是你的代码应该停止在内存问题上失败......


<强>更新

如果您想要在list_of_classes_ids中列出未出现在compile.js中的所有字词,请尝试执行以下操作:

compile_js = IO.read('compile.js')
selectors_not_found = list_of_classes_ids.compact.reject { |class_id| compile_js[class_id] }