1

I have a neat little script in python that I would like to port to Ruby and I think it's highlighting my noobishness at Ruby. I'm getting the error that there is an unexpected END statement, but I don't see how this can be so. Perhaps there is a keyword that requires an END or something that doesn't want an END that I forgot about. Here is all of the code leading up to the offending line Offending line is commented.

begin
    require base64
    require base32
rescue LoadError
    puts "etext requires base32. use 'gem install --remote base32' and try again"
end

# Get a string from a text file from disk
filename = ARGV.first
textFile = File.open(filename)
text = textFile.read()

mailType = "text only" # set the default mailType

#cut the email up by sections
textList1 = text.split(/\n\n/)
header = textList1[0]

if header.match (/MIME-Version/)
    mailType = "MIME"
end

#If mail has no attachments, parse as text-only. This is the class that does this
class TextOnlyMailParser

    def initialize(textList)
        a = 1
        body = ""
        header = textList[0]
        @parsedEmail = Email.new(header)
        while a < textList.count
            body += ('\n' + textList[a] + '\n')
            a += 1
            end
        @parsedEmail.body = body
    end
end

def separate(text,boundary = nil)
    # returns list of strings and lists containing all of the parts of the email
    if !boundary #look in the email for "boundary= X"
        text.scan(/(?<=boundary=).*/) do |bound|
            textList = recursiveSplit(text,bound)
            end
        return textList
    end
    if boundary 
        textList = recursiveSplit(text,boundary)
    end
end


def recursiveSplit(chunk,boundary)
    if chunk.is_a? String
        searchString = "--" + boundary
        ar = cunk.split(searchString)
        return ar
    elsif chunk.is_a? Array
        chunk do |bit|
            recursiveSplit(bit,boundary);
        end
    end
end

class MIMEParser
    def initialize(textList)
        @textList = textList
        @nestedItems = []
        newItem = NestItem.new(self)
        newItem.value = @textList[0]
        newItem.contentType = "Header"
        @nestedItems.push(newItem)
        #setup parsed email
        @parsedEmail = Email.new(newItem.value)
        self._constructNest
    end

        def checkForContentSpecial(item)
        match = item.value.match (/Content-Disposition: attachment/)
        if match
            filename = item.value.match (/(?<=filename=").+(?=")/)
            encoding = item.value.match (/(?<=Content-Transfer-Encoding: ).+/)
            data = item.value.match (/(?<=\n\n).*(?=(\n--)|(--))/m)
            dataGroup = data.split(/\n/)
            dataString = ''
            i = 0
            while i < dataGroup.count
                dataString += dataGroup[i]
                i ++
            end #<-----THIS IS THE OFFENDING LINE
            @parsedEmail.attachments.push(Attachment.new(filename,encoding,dataString))
        end
4

1 回答 1

2

您的问题是该i ++行,Ruby 没有 post 或 pre 递增/递减运算符,并且该行无法解析。我个人无法解释为什么i++在 IRB 中进行评估但i ++不执行任何操作。

而是将您的++运营商替换+= 1为 last while

while i < dataGroup.count
  dataString += dataGroup[i]
  i += 1
end

但也要考虑红宝石的方式,如果你只是将它添加到一个字符串中,为什么不做 adataString = dataGroup.join而不是用 while 构造循环呢?

于 2013-05-13T21:25:58.790 回答