Ruby读取含Heredoc的文本文件:如何去除语法并完成变量插值?
解决方案
你当前的代码只是读取了文件的原始字符串,并没有让Ruby解析Heredoc中的插值逻辑。要实现需求,需要分两步:提取Heredoc内部的文本,再让Ruby执行插值计算。
步骤1:定义依赖方法(如果还没定义)
原问题中用到了upcase_def方法,确保先在代码中定义它:
def upcase_def(str) str.upcase end
步骤2:读取并处理文件内容
# 读取文件的原始内容 raw_content = File.read("path_directory/file_with_heredoc.txt") # 用正则提取Heredoc标记(EOM)之间的内容 # 正则中的m修饰符允许.匹配换行符,.*?做非贪婪匹配避免匹配到多余内容 inner_text = raw_content.match(/<<-EOM\n(.*?)EOM/m)[1].strip # 将提取的文本转为Ruby可解析的双引号字符串,执行插值计算 final_result = eval("\"#{inner_text}\"") # 输出最终结果 puts final_result
代码解释
- 提取Heredoc内容:通过正则匹配去掉外层的
file = <<-EOM和EOM标记,只保留需要插值的文本部分。 - 执行插值:用
eval将提取的文本包装成双引号字符串,让Ruby自动解析其中的#{}插值表达式,执行对应的方法调用并替换结果。 - 安全提醒:
eval会执行任意Ruby代码,仅当你能确保读取的文件是可信的(比如用户自己编写的模板)时使用,避免注入风险。
运行这段代码后,终端会输出你期望的结果:
single text with def result: HELLO
内容的提问来源于stack exchange,提问作者MMfood
相关产品推荐
相关产品推荐

