Ruby 2.7.0中如何去除读取文件所得数组首尾的双引号
问题原因
你看到的首尾双引号根本不是文件里存的内容,是IRB输出字符串类型值时自带的类型标记。IO.read读任何文件返回的都是字符串,不会自动把内容解析成Ruby数组对象,所以你用gsub替换双引号完全没用——字符串内容本身就没有双引号,你替换空目标当然不会生效。
解决方法
推荐方案:安全解析,无注入风险
直接处理字符串结构拆分出数组元素即可,不需要依赖额外库:
ports = IO.read('/ports_values') .strip # 去掉首尾换行、多余空格 .then { |s| s[1..-2] } # 砍掉首尾包裹数组的[]两个字符 .split(',') # 按逗号拆分每个元素片段 .map { |item| item.strip.delete_prefix("'").delete_suffix("'") } # 清理每个元素首尾的空格、单引号
执行完ports就是原生Ruby数组,IRB输出的时候就不会带外层的字符串双引号,和你预期的结果完全一致。
可选方案:可信文件下的快速解析
如果这个文件完全由你自己维护、不存在被篡改注入恶意代码的可能,可以用YAML标准库快速解析,比直接用eval安全得多:
require 'yaml' # 先把内容里的单引号替换成双引号,符合YAML数组格式要求后再解析 ports = YAML.safe_load(IO.read('/ports_values').tr("'", '"'))
注意:绝对不要直接写eval(IO.read('/ports_values')),只要文件内容被篡改就会执行任意恶意代码,生产环境严格禁用。
之前操作的误区
你之前的思路完全错了:你要做的从来不是「去掉字符串里的双引号」,而是把字符串类型的数组格式文本,转换成真正的Ruby数组类型对象。只要变量还是字符串类型,不管你怎么替换内容,IRB输出的时候都会在外层带双引号做类型标记。
内容的提问来源于stack exchange,提问作者Sam2022
相关产品推荐
相关产品推荐

