与.sub和.gsub有一些问题

时间:2013-11-05 15:59:15

标签: ruby

我正在尝试运行一些Oracle性能测试。我有以下文件:

orcheck.txt

select * from mf_aj where uid_lo in ('OOO',) or uid_lo in

我想复制'OOO' 100次,然后将每个or uid_lo in (...)复制100次。

File.open('orcheck.txt' , 'r') do |f|
  i = 0
  contents = f.read.gsub("'OOO',") { |m|
    m.sub("'OOO',", (m * 1000))
  }

  theClause = contents[/\((.*)in/]
  contents.gsub(theClause, (theClause * 100))

  contents.gsub("'OOO',") { |m|
    m.sub('OOO', (i += 1).to_s)
  }

  File.write('orcheck.txt', contents.to_s)
end

第一个.gsub工作正常,并重复'OOO' 1000次。但是,theClause的以下.gsub并用增加的int替换'OOO'不会。有人可以帮我弄清楚我哪里出错了吗?

2 个答案:

答案 0 :(得分:2)

在这里使用正则表达式是没有意义的。

 > 100.times.collect { |n| "'%03d'" % n }.join(',')
=> "'000','001','002','003','004', etc

因此:

s = 100.times.collect { |n| "'%03d'" % n }.join(',')
q = "select * from mf_aj where uid_lo in (#{s})"

修改以适合您的实际查询,并使用类似的技术创建多余的尾随in

至于其他方面,我感到困惑:你创建了文本文件,这与Oracle没有任何关系。目前还不清楚你要从IMO的描述中做些什么。

答案 1 :(得分:1)

这一行

  contents.gsub(theClause, (theClause * 100))

不会修改contents。它返回一个修改过的String。

  contents.gsub!(theClause, (theClause * 100))

然后会修改contents。按照惯例,以结尾的ruby方法!是以某种方式修改对象的方法,而其他方法则不是。这不是绝对的,但它确实是一个相当大的时间。