Best of Ruby Quiz - MadLib

 题目大意明确,主要在于正则表达式运用

1]

首先是自己写的程序

 

ExpandedBlockStart.gif ContractedBlock.gif str  =   % q {Our favorite language is ((gem:a gemstone)). We think ((gem)) is 
better than ((a gemstone)). }

ExpandedBlockStart.gifContractedBlock.gifhash 
=   {}

def read(prompt)
  print 
" Give Me #{prompt}: "
  gets.chomp  
end

while  str  =~   / \(\(. *? \)\) /
  pre,suc 
=  $`,$ '
  $ &   =~   / \(\((. *? )\:(. *? )\)\) | \(\((. *? )\)\) /
  key , prompt 
=  $ 1   ||  $ 3  , $ 2   ||  $ 3
  hash[key] 
||=  read(prompt)
  str 
=  pre  +  hash[key]  +  suc
end

print str + "\n"

属于比较正常的算法型想法,流式替换过程

 

2]

然后是书上的程序,最简短的那个

1 ExpandedBlockStart.gif ContractedBlock.gif str  =   % q {Our favorite language is ((gem:a gemstone)). We think ((gem)) is 
2better than ((a gemstone)). }
3 hash  =  Hash. new   do   | hash,key |
4     print  " Give Me #{key.sub /\A([^:]+):/, ""  } : "
5     #p $ 1
6     hash[$ 1 =  gets.chomp
7 end
8 ExpandedBlockStart.gifContractedBlock.gifputs str.gsub( / \(\(([ ^ \)] + )\)\) / ) {hash[$1]}
9 #puts str.gsub( / \(\(([ ^ \)] + )\)\) /  , hash[$ 1 ])

 稍微有些出入,大体一样

做一些分析:

[0]这个程序存在BUG,如果把第五行注释解开,可以看到输出的第一个$1 = "gem" ,第二个$2 = "nil",BUG在后面我的改进里有修正

[1]第八行用gsub的Block形式十分重要,以下是Programming Ruby的节选

gsub 
带有block的形式,当前的匹配会作为参数传入block,并且会适当设置$1,$2,$`,$&,$'等变量

 如果用第9行的形式,会出现$1 = nil 的错误,因为用参数形式$1不能正确配置

 

 修正后的程序

1 ExpandedBlockStart.gif ContractedBlock.gif str  =   % q {Our favorite language is ((gem:a gemstone)). We think ((gem)) is 
2better than ((a gemstone)). }
3 hash  =  Hash. new   do   | hash,key |
4     print  " Give Me #{key.sub /^([^:]+):/, ""  } : "
5     #p $ 1   ||  key
6     hash[$ 1   ||  key]  =  gets.chomp
7 end
8 ExpandedBlockStart.gifContractedBlock.gifputs str.gsub( / \(\(([ ^ \)] + )\)\) / ) {hash[$1]}

 

 修正的结果可以将注释行解开验证

转载于:https://www.cnblogs.com/Tachikoma/archive/2008/07/22/1248791.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值