Ruby 为什么会出现“语法错误,意外结束”和“输入意外结束”?
当我运行代码时,会收到非常奇怪的错误消息: /Users/Pan/Data/external/filter_url_1008.rb:35: syntax error, unexpected keyword_end /Users/Pan/Data/external/filter_url_1008.rb:45: syntax error, unexpected end-of-input, expecting keyword_end filter_file.close ^ 是否删除if语句行上的then?它可能是有效的,但肯定不是常见用法 Ruby也没有++操作符。在Ruby中不能使用++操作符。 改用match_count+=1 编辑Ruby 为什么会出现“语法错误,意外结束”和“输入意外结束”?,ruby,Ruby,当我运行代码时,会收到非常奇怪的错误消息: /Users/Pan/Data/external/filter_url_1008.rb:35: syntax error, unexpected keyword_end /Users/Pan/Data/external/filter_url_1008.rb:45: syntax error, unexpected end-of-input, expecting keyword_end filter_file.close
它们并不是真正奇怪的错误消息,只是一条表明语法错误的消息:程序甚至还没有开始被解释,这是一个预运行检查。您做了一些错误的事情。这并不是试图重写代码以避免出错,而是展示如何以更易于维护的风格编写代码,更接近Ruby方式:
require 'fileutils'
SOURCE_DIR = '/20131008'
DEST_DIR ='/20131008_filtered'
BLACKLIST = %w[
adf.ly
bebo.com
bing.com
bullhornreach
craigslist.org
ebay.com
ebayrt.com
facebook.com
feedsportal
foursquare.com
google.co.uk
google.com
google.ie
instagram.com
itunes.apple.com
linkedin.com
maps.google
pinterest.com
tumblr.com
twitlonger.com
twitpic.com
twitter.com
waze.com
youtube.com
]
unless File.exist?(DEST_DIR)
FileUtils.mkdir_p(DEST_DIR)
print(DEST_DIR + " was created!\n")
end
File.foreach("filtered_index.txt") do |line|
# $match_count = 0
match_count = 0
BLACKLIST.each do |blacklist_atom|
match_count += 1 unless (line.downcase[blacklist_atom])
end
if (BLACKLIST.length == match_count)
FileUtils.cp(
File.join(
SOURCE_DIR,
File.basename(
line,
File.extname(line)
) + '.html'
),
DEST_DIR
)
end
end
出了什么问题:
使用常量,并将其移动到文件顶部,以便查看/编辑。
按照站点名称对列表进行排序,以便更容易编辑/扩展列表,并查看是否已有条目。
不要打开一个文件,做一堆事情,然后把它全部读到内存中,做更多的事情,拆分它,然后迭代行,然后做一堆事情,然后关闭它。相反,请使用更智能的文件方法,如File.foreach,并使用块自动打开然后关闭文件。将文件完全读入内存是一个非常坏的习惯,因为它根本不可伸缩;想象一下,如果文件大于程序的可用内存,将会发生什么。
您没有将变量插入字符串,还添加了一个额外的前导路径分隔符:
FileUtils.mkdir_p("/dest_dir")
不要在块中使用$global变量。这表明对变量作用域缺乏了解
全局变量$match_count仅初始化,不读取。
您可以更简洁地编写非子字符串搜索:
if !(line.downcase.include? "blacklist_atom")
使用类似于:
unless line.downcase[blacklist_atom]
使用内置功能:
filename_cp = line[line.index("20131008/") + 9..line.index(".html") - 1]
相反,请使用File.join。。。因为它知道操作系统需要什么路径分隔符。使用File.basename。。。因为它使用相同的路径分隔符来提取文件
ilename=filename\u cp.to\u s+.html?很抱歉,这是一个类型错误,我已将其更改。问题仍然是一样的,你知道怎么回事吗?基本上我想做的是选择一堆遵守我设置的规则的html文件,并将它们复制到一个新文件夹。@meagar match_count++导致错误…@ArupRakshit是的,我是ruby-c test.rb在错误的目录中;我需要停止离开test.rbs到处乱跑:|是的,我的也崩溃了,但这是一个不存在的目录错误。奇怪的是,我会仔细检查是否还有其他错误。谢谢./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/Ruby/2.0.0/fileutils.rb:245:in`mkdir':权限被拒绝-/20131008\u filtered Errno::EACCES,我试图删除创建目录的这段代码,仍然出错。需要检查整个代码。@user2641480您粘贴的是权限错误:您无法在/System/…中写入或创建目录。。。没有根。尝试使用sudo启动程序,或者,更好的是,尝试移动/20131008_filtered inside~/以避免触摸/。理解,尝试检查逻辑。谢谢,尝试了你告诉我的。仍然不工作,我想知道目录路径可能有问题。真的,谢谢你的帮助。我是编程新手,将来会更加努力。
filename_cp = line[line.index("20131008/") + 9..line.index(".html") - 1]