Ruby-Files-get方法

Ruby-Files-get方法,ruby,Ruby,我正在阅读一本非常酷的ruby脚本书。 在这里 有两个文件,file_output=file_list.txt和oldfile_output=file_list.old。这两个文件包含程序经过和将要经过的所有文件的列表。 现在,如果存在“file_list.txt”文件,则该文件将重命名为旧文件。 然后,我无法理解代码 显然,文件的每一行都被读取,并存储在oldfilehash中。 有人能从这句台词中解释一下吗 还有,为什么在这里使用is?为什么不能用每种方法通读每一行 if File.exis

我正在阅读一本非常酷的ruby脚本书。 在这里 有两个文件,file_output=file_list.txt和oldfile_output=file_list.old。这两个文件包含程序经过和将要经过的所有文件的列表。 现在,如果存在“file_list.txt”文件,则该文件将重命名为旧文件。 然后,我无法理解代码

显然,文件的每一行都被读取,并存储在oldfilehash中。 有人能从这句台词中解释一下吗

还有,为什么在这里使用is?为什么不能用每种方法通读每一行

if File.exists?(file_output)
  File.rename(file_output, oldfile_output)
  File.open(oldfile_output, 'rb') do |infile|
  while (temp = infile.gets)
    line = /(.+)\s{5,5}(\w{32,32})/.match(temp)
    puts "#{line[1]} ---> #{line[2]}"
    oldfile_hash[line[1]] = line[2]
  end
 end
end

因此,使用.get的目的是告诉您何时完成文件的读取。本质上,它与

while (condition)
      ....
end

街区。因此gets充当了一个小方法,它将继续为ruby提供文件的下一行,直到没有更多的行可以提供为止

从在正则表达式中重复使用量词{5,5}和{32,32}(最好写为{5},{32})来看,编写代码的人似乎不是专业的Ruby程序员。因此,您可以假设代码中的选择不一定是最好的

正如您所指出的,代码可以使用each而不是while with get。后一种方法是一种老式的Ruby方法。使用它没有什么错。在到达文件末尾之前,get将返回一个字符串,当它到达文件末尾时,get将返回nil,因此while循环在使用它们时的工作方式相同;在每次迭代中,它读取下一行


看起来每一行都应该代表一个键值对。正则表达式假定键不是空字符串,键和值之间正好有五个空格,值正好由三十二个字母组成。打印每个键值对可能是为了监控进度,并存储在oldfile_hash中,这很可能是一个hash。

第5行在这里做什么?此脚本与脚本完全相反。太可怕了,好吧,太糟糕了!你能回答下面的评论吗!关键值?我得到的只是一个带有路径和一个32个字母的巨大值的文件列表。如果我更改s{}和w{}并再次运行脚本,我将得到相同的输出,但也不会打印。旧文件\u hash=line[1]=line[2]如何将值存储到哈希中?要快速运行程序,首先运行脚本,所有文件的列表都包含在文件\u list.txt中的MD5哈希中。然后,当脚本再次运行时,文件_list.txt将重命名为文件_list.old,并创建新文件_list.txt。现在,文件列表。旧文件已获取,示教行是否与模式匹配?然后添加到散列?你能解释一下模式吗?在文件_list.old中,格式为/dir/dir/dir/file.rb a4434343f3f3343434ftj6a