0

我在 下有一系列 zip 文件@workingdir,并且正在尝试解压缩匹配的文件@Regexp,并从中打印行。

require 'zip/zip'
@workingdir = '/my/dir/structure/*.zip'
@Regexp = '/yup:maybe.*nope/i'

Dir.glob(@workingdir) do |zips|
    Zip::ZipFile.open(zips) do |file|
        file.each do |search|
            tempFile = file.read(search)
            tempFile.each do |line|
                if (line =~ @Regexp ) then
                p line
                end
            end
        end
    end
end

以下是来自 IRB 的错误消息:

NoMethodError: undefined method `each' for #<String:0x0000000168bf40>
from (irb):70:in `block (3 levels) in irb_binding'
from /var/lib/gems/1.9.1/gems/rubyzip2-2.0.2/lib/zip/zip.rb:1122:in `each'
from /var/lib/gems/1.9.1/gems/rubyzip2-2.0.2/lib/zip/zip.rb:1122:in `each'
from /var/lib/gems/1.9.1/gems/rubyzip2-2.0.2/lib/zip/zip.rb:1265:in `each'
from (irb):68:in `block (2 levels) in irb_binding'
from /var/lib/gems/1.9.1/gems/rubyzip2-2.0.2/lib/zip/zip.rb:1381:in `open'
from (irb):67:in `block in irb_binding'
from (irb):66:in `glob'
from (irb):66
from /usr/bin/irb:12:in `<main>'

我试过tempFile.grep了,收到了同样的错误,除了那grep是一个未定义的方法。我相信我需要定义一个类。

4

1 回答 1

1

原来我的代码有两个问题。1)我的正则表达式被作为字符串处理(我不应该使用引号)。2) 看到它在 Ruby 1.8.7 上运行良好,我怀疑 1.8.7 和 1.9.1 处理“每个”方法的方式有所不同。如果有人有其他见解,我很高兴听到他们的声音。下面的代码在 1.8.7 上运行良好:

require 'zip/zip'
@workingdir = '/my/dir/structure/*.zip'
@Regexp = /regexp/i

Dir.glob(@workingdir) do |zips|
    Zip::ZipFile.open(zips) do |file|
        file.each do |search|
            tempFile = file.read(search)
            tempFile.each do |line|
                if (line =~ @Regexp) then
        puts zips + ': ' + line.chomp
                end
            end
        end
    end
end

再次感谢大家!

于 2013-10-21T15:38:34.023 回答