Ruby编译错误

时间:2014-06-20 16:04:47

标签: ruby cygwin notepad++

我目前正在Notepad ++中编写代码并使用Cygwin Terminal运行它。我听说cygwin对缩进和空格非常严格所以我使用了在线格式化程序并格式化了我的代码。这是我的格式化代码:

    open("Safeway.html"){ 
    |f|f.each_line.find_all{|line|/"\/recipe\//.match(
    line)}.map {|line| line.split [4..5].join(' ')} }

我遇到了这个错误:

Scraper.rb.txt:2:in `match': invalid byte sequence in UTF-8 (ArgumentError)
    from Scraper.rb.txt:2:in `block (2 levels) in <main>'
    from Scraper.rb.txt:2:in `each_line'
    from Scraper.rb.txt:2:in `each'
    from Scraper.rb.txt:2:in `find_all'
    from Scraper.rb.txt:2:in `block in <main>'
    from Scraper.rb.txt:1:in `open'
    from Scraper.rb.txt:1:in `<main>'

这个错误意味着什么,我该如何解决?

3 个答案:

答案 0 :(得分:0)

当你使用块时,Ruby对于换行非常挑剔。如果您重新格式化上面的内容

open("Safeway.html"){ |f| f.each_line.find_all { |line| /"\/recipe\//.match(line) }.map { |line| line.split [4..5].join(' ') } }

它有效。

如果您将其重新格式化为

open("Safeway.html"){ |f| 
  f.each_line.find_all { |line| 
    /"\/recipe\//.match(line) 
  }.map { |line| 
    line.split [4..5].join(' ') 
  } 
}

它似乎也解析得很好。

基本上,只需要更加小心你的换行符。

答案 1 :(得分:0)

在Ruby中,换行符表示语句的结束,除非存在一些未闭合的语法

翻译时读

open("Safeway.html")

它看到一个方法调用。完成。到下一行。它看到的第一件事是{并且它认为,&#34;啊,这必须是哈希文字&#34;。但是它看到|在Hash文字中没有位置。这是一个语法错误。如果将{移动到上一行的末尾,Ruby会理解它是块,而不是哈希。

该行的结尾是

/"\/recipe\//.match

同样,它将此视为没有参数的方法调用。完成。但它甚至没有到达下一行,因为match需要参数!这是一个争论错误。再次,只需将(从下一行移到此一行。

答案 2 :(得分:0)

我认为问题出在"Safeway.html"文件的内容中。

我建议您在运行match之前打印每一行,并查看异常发生在哪一行:

open("Safeway.html") do |f|
  f.each_line.find_all do |line|
    puts line
    /"\/recipe\//.match(line)
  end.map {|line| line.split [4..5].join(' ')}
end

抛出异常之前打印的行(或者可能是之后的行)是有问题的行 - 它中是否有奇怪的字符?也许看不见的角色?