2012-03-01 70 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