Ruby中无需正则从STDIN提取多行注释的实现方法
嘿,我来帮你解决这两个问题!
提取=begin/=end注释内容的正确实现
你的初始代码有几个小问题,比如状态变量incomments被放在循环里每次重置,导致无法持续跟踪是否处于注释块;另外还错误打印了=end那行。这里给你一个不用正则的正确实现:
starting = "=begin" ending = "=end" in_comments = false ARGF.each do |line| # 进入注释块的情况:行里有=begin但没有=end if line.include?(starting) && !line.include?(ending) in_comments = true next # 跳过=begin所在行 end # 退出注释块的情况:行里有=end但没有=begin if line.include?(ending) && !line.include?(starting) in_comments = false next # 跳过=end所在行 end # 如果处于注释块内,打印当前行(可按需去除左侧空格) puts line.lstrip if in_comments end
逻辑说明:
- 把
in_comments状态变量放在循环外部,确保它能在整个遍历过程中保持状态,不会每次循环都被重置 - 遇到
=begin行时,激活注释状态并跳过该行(我们不需要输出开头标记) - 遇到
=end行时,关闭注释状态并跳过该行(同样不需要输出结尾标记) - 只有处于注释状态时,才打印当前行的内容,用
lstrip可以去掉行首的空格,让输出更整洁
用你提供的测试输入运行这段代码,就能得到你想要的注释中间内容啦。
关于ARGF的性能疑问
ARGF并不会因为“等待所有输入”产生额外的性能开销。它的工作机制是逐行读取输入——不管输入来自单个文件、多个文件还是标准输入,它都是读一行处理一行,不会把所有内容先加载到内存里。
实际使用中,ARGF的性能和直接读取单个文件/STDIN几乎没有差异,主要的性能消耗都是来自IO操作本身。除非你处理的是超大规模的输入,这种情况下不管用什么方式读取,IO都会是瓶颈,ARGF本身不会带来额外的负担。它的设计初衷就是方便处理多输入源,不用特意担心性能问题。
内容的提问来源于stack exchange,提问作者jeancode
相关产品推荐
相关产品推荐

