2013-10-20 2 views
0

@workingdir 아래에 일련의 zip 파일이 있고 @Regexp과 일치하는 파일의 압축을 풀고 그 파일의 행을 인쇄하려고합니다. I는 tempFile.grep을 시도하고, 그 grep 정의되지 않은 방법 이외에는 동일한 오류를 수신Ruby Regexp 작업에서 각각 정의되지 않은 메소드

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>' 

:

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는 아래의 에러 메시지이다. 클래스를 정의해야한다고 생각합니다.

답변

1

내 코드가 두 가지 문제점을 일으켰습니다. 1) 정규식이 문자열로 처리되었습니다 (따옴표를 사용해서는 안됩니다). 2) Ruby 1.8.7에서 잘 돌아가는 것을 보면, 1.8.7과 1.9.1에서 'each'메소드를 처리하는 방법의 차이라고 생각됩니다. 누구라도 더 많은 통찰력을 가지고 있다면, 나는 그것들을 듣게되어 기쁘다. 아래 코드는 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 

감사합니다.

관련 문제