Ruby中新的行分隔符系统

Ruby中新的行分隔符系统,ruby,newline,Ruby,Newline,如何在Ruby中确定OS(LF、CR/LF或其他)使用的新行分隔符?不确定是否有基于OS的新行类型的直接解决方案,但存在保存“输入记录分隔符”的$/变量。默认情况下,这将是“\n”。() 您可以检测操作系统,然后将$/设置为“正确”值 要检测操作系统,请执行以下操作: puts RUBY_PLATFORM # => 'i386-linux' require 'rbconfig' puts Config::CONFIG['target_cpu'] # =

如何在Ruby中确定OS(LF、CR/LF或其他)使用的新行分隔符?

不确定是否有基于OS的新行类型的直接解决方案,但存在保存“输入记录分隔符”的
$/
变量。默认情况下,这将是“\n”。()

您可以检测操作系统,然后将
$/
设置为“正确”值

要检测操作系统,请执行以下操作:

puts RUBY_PLATFORM                  # => 'i386-linux'
require 'rbconfig'
puts Config::CONFIG['target_cpu']   # => 'i386'
puts Config::CONFIG['target_os']    # => 'linux'
puts Config::CONFIG['host_cpu']     # => 'i686'
puts Config::CONFIG['host_os']      # => 'linux-gnu'

还要记住,在读取文件时,它们可能混合使用各种行分隔符——例如,如果文本文件在Windows和Linux中都进行了编辑。因此,如果您正在处理文件,不要完全依赖“操作系统行分隔器”。

您不需要这样做。在您的情况下,我认为您可以使用FileUtils。

为什么需要这些信息?您的用例是什么?我正在编写一种面向对象的框架来处理文件,并希望消除诸如“文本/二进制模式”、“FTP加密时的字符集转换”等遗留问题。我决定最好以二进制模式执行所有操作,这导致了“MyFile.puts”方法的一个小问题。该函数的目的是在行尾写入新行分隔符,分隔符应该是框架用户最期望的分隔符之一。这似乎是非常有问题的。最好不要重新发明该语言已经提供给您的文件处理。Ruby已经有了一个处理文件的OO框架……据我所知,FileUtils只是一组获取文件名并执行一些操作的例程。这不是OO框架。我所期望的是一个文件的抽象(无论是本地的、远程的、星型的还是任何其他的),它有一些适用于它的操作,比如“复制到目录”、“删除”、“打开”等等。这就是我要做的。我获取文件的一个实例(
f=LocalFile['abc.txt']
)或创建一个新文件(
f=LocalFile.new('def.txt','SOME CONTENT')
),然后根据需要对其进行规则:
f.copy_to(Directory.temporary)。重写{CONTENT | CONTENT.gsub(“abc”,“def”)}。移动到(RemoteDirectory['ftp://localhost/here'])
etc.与FileUtils类似:
File.write(f=“abc.txt”,“某些内容”);cp(f,董事tmpdir);重写(f){|内容|…};mv(f,什么?)
。我想使用功能齐全的程序对象,而不是字符串之类的文件。我使用的是非常旧的硬件和操作系统,它们不能正确使用FTP。我需要确定系统新行分隔符,这样我就可以通过损坏的FTP传输文件。你能再解释一下吗?特别是,FTP实现是如何被破坏的?对于Net::FTP来说,它是否太坏了?不,Net::FTP工作正常。这是一个IBM大型机,在文本模式下,它处理本地系统换行符作为记录分隔符。而且不可能在本地执行所有需要的转换,也不可能以二进制模式传输文件,因为无法将记录分隔符标记放入文件中。那么,问题出在哪里呢?我想摆脱zoo模式(文本、二进制、shminary等),只保留二进制模式。而且我仍然希望使用传统硬件。好的,我认为没有更好的解决方案。
File.open("some_temporary_file", "w") { |file| file.puts }
new_line_separator =
  File.open("some_temporary_file", "rb") { |file| file.read }