2013-05-04 18 views
2

我有一个脚本,用于分析大型文本文件,提取某些值(使用line.split),并将它们存储在文本文件中。当八进制值保存到文件时,我遇到问题时无法解释。红宝石不会逃脱put的投入

当我手动指定octstring字符,它工作正常:

test = "\320\232\320\250\320\220" 

puts test 

但是,如果我得到上面使用title = line.split('=')[1]字符串,字符串值是相同的,但是当我试图puts,它只是重新声明整个字符串(包括引号)

我在做什么错?

+1

我不确定'split'来自哪里。你是否试图解析你的实际Ruby源代码?在这种情况下,你需要做一些事情来解释转义序列。一个微不足道(但不太理想)的方法是评估它,但这取决于你的目标。 – 2013-05-04 03:16:09

+0

我从我正在搜索的大文本文件中解析出一个字符串。我对Ruby非常陌生(如你所见)。有时我收集的值将包括八位字符代码,有时可能完全在他们之外。我如何使用eval? – user2348854 2013-05-04 03:22:21

+0

只有当您的目标是评估Ruby表达式时,'eval'才适用。如果这些只是具有转义序列的不可信的字符串,则需要一种可以避开它们的方法。 PHP有一些内置的;看起来您需要在Ruby中编写或查找一个支持您的字符串可能包含的任何转义序列的文件。 – 2013-05-04 03:32:38

回答

1

当在ruby源代码中遇到文字字符串时,ruby解释器将查看字符串并执行某些转义,例如您指定的八进制。如果您将换行符放在带有“\ n”的字符串中,也是如此。

但是,当您从文件读取数据时,不会发生插值。如果你想这样做,你将不得不使用字符串搜索或正则表达式自己查找和更改值的逻辑。

理想情况下,您正在阅读的文件不会有八进制转义文本,它只会在文件中具有实际值。这将摆脱一些相当复杂的文本解析的需要,并允许您按照预期阅读文件。

2

@xaxxon解释了为什么从文件中读取字符串而不是将它们呈现为ruby文字时,您的八进制代码未被转换。这是一个简单的方法,它可以将八进制\ xxx编码子字符串转换为相应的ascii字符。

def octal_convert(s) 
    s.gsub(/\\(?:\\|[0-7]{3})/) do |capture| 
    capture == "\\\\" ? 
     "\\" : 
     capture[1,3].to_i(8).chr 
    end 
end 

test = 'ab\\\\cd\320\232\320\250\320\220' 
=> "ab\\\\cd\\320\\232\\320\\250\\320\\220" 
octal_convert(test) 
=> "ab\\cd\xD0\x9A\xD0\xA8\xD0\x90" 
+0

非常好:)我认为,“相当复杂”是在旁观者的眼中。 – xaxxon 2013-05-04 23:04:56

+0

正是我在找的! – 2016-06-29 10:05:29