I am trying to create a hash bashed off of a file /etc/mime.types in ubuntu for example that splits each line on white space and "not word" regular expression search. Below is my code. but I cannot get it to output the nil valued ones correctly. they out put with everything else but if you pretty print them with pp some are returning as nil. Any suggestions?
#!/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
This is only the tail end of the output which is easiest to see since its right in front when you execute
I expect
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
but i get
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
The string 'nil'
and the object nil
are not the same thing. Your mime.has_value?('nil')
is asking the Hash if one of its values is the string 'nil'
, not the object nil
. You (think you) want this:
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
And has_value?
returns true
or false
so you don't need to compare its return value against true
and false
, just if(mime.has_value?(nil)) ... else
is sufficient.
But that still won't give you what you're looking for. Your if
will claim that all keys have no extensions if at least one of them doesn't and that doesn't make much sense. You want to iterate over mime
with something like this:
mime.each do |k, v|
if(v.nil?)
puts "#{k} has no extensions"
else
puts "#{k} has extensions #{v}"
end
end