2012-03-01 66 views
1

我想创建一个散列,例如在ubuntu中创建一个文件/etc/mime.types,将每一行分割为空白和“不是词”正则表达式搜索。以下是我的代码。但我无法正确输出无值的值。他们把所有其他的东西放在一起,但如果你用pp打印它们,有些人会返回为零。有什么建议么?使用正则表达式对散列进行行分割

#!/usr/bin/ruby 
mime = Hash.new() 

File.open("/etc/mime.types", "r") do |file| 
    file.each_line do |line| 
    next if line[0] == ?# 
    next if line == "\n" 
    key, value = line.chomp.split(/\W+\s/) 
    mime[key] = value 
    end 
end 

if (mime.has_value?('nil') == true) 
    mime.sort.each {|key,value| puts "#{key} has no extensions."} 
elsif(mime.has_value?('nil') == false) 
    mime.sort.each {|key, value| puts "#{key} has extensions #{value}"} 
end 

这仅仅是输出这是最简单的,因为它的右前方看,当你执行

我希望

video/quicktime has extensions qt mov 
**video/vnd.fvt has no extensions** 
**video/vnd.motorola.video has no extensions 
video/vnd.motorola.videop has no extensions** 
video/vnd.mpegurl has extensions mxu 
**video/vnd.mts has no extensions no** 
video/vnd.nokia.interleaved-multimedia has extensions 
**video/vnd.vivo has no extensions** 
video/x-flv has extensions flv 
video/x-la-asf has extensions lsf lsx 
video/x-matroska has extensions mpv mkv 
video/x-mng has extensions mng 
video/x-ms-asf has extensions asf asx 
video/x-ms-wm has extensions wm 
video/x-ms-wmv has extensions wmv 
video/x-ms-wmx has extensions wmx 
video/x-ms-wvx has extensions wvx 
video/x-msvideo has extensions avi 
video/x-sgi-movie has extensions movie 
x-conference/x-cooltalk has extensions ice 
x-epoc/x-sisx-app has extensions sisx 
x-world/x-vrml has extensions vrm vrml wrl 

,但我得到

video/quicktime has extensions qt mov 
video/vnd.fvt has extensions 
video/vnd.motorola.video has extensions 
video/vnd.motorola.videop has extensions 
video/vnd.mpegurl has extensions mxu 
video/vnd.mts has extensions 
video/vnd.nokia.interleaved-multimedia has extensions 
video/vnd.vivo has extensions 
video/x-flv has extensions flv 
video/x-la-asf has extensions lsf lsx 
video/x-matroska has extensions mpv mkv 
video/x-mng has extensions mng 
video/x-ms-asf has extensions asf asx 
video/x-ms-wm has extensions wm 
video/x-ms-wmv has extensions wmv 
video/x-ms-wmx has extensions wmx 
video/x-ms-wvx has extensions wvx 
video/x-msvideo has extensions avi 
video/x-sgi-movie has extensions movie 
x-conference/x-cooltalk has extensions ice 
x-epoc/x-sisx-app has extensions sisx 
x-world/x-vrml has extensions vrm vrml wrl 
的尾部
+0

你可以请列出你期望的输出,你得到的输出,为示例文件。 – abhishek 2012-03-01 03:49:13

回答

5

字符串'nil'和对象nil不是同一回事。您的mime.has_value?('nil')询问哈希值是否为字符串'nil'而不是对象nil。你(想你)想这样的:

if(mime.has_value?(nil)) 
    mime.sort.each {|key,value| puts "#{key} has no extensions."} 
else 
    mime.sort.each {|key, value| puts "#{key} has extensions #{value}"} 
end 

而且has_value?回报truefalse,所以你不需要它的返回值对truefalse比较,只是if(mime.has_value?(nil)) ... else就足够了。

但是,这仍然不会给你你想要的。您的if将声称所有密钥没有扩展名,如果其中至少有一个没有扩展,那没有多大意义。你想迭代mime这样的事情:

mime.each do |k, v| 
    if(v.nil?) 
    puts "#{k} has no extensions" 
    else 
    puts "#{k} has extensions #{v}" 
    end 
end 
+0

你先生是个天才。我甚至没有考虑迭代散列。 我拉了一个伙计在这个谁也得不到它。 – 2012-03-01 04:06:29

+0

@斯巴达-196:最难看的东西往往是那些在你面前的人:) – 2012-03-01 04:27:39