Разделение строк для хэшей с использованием регулярных выражений - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь создать хеш-файл из файла /etc/mime.types в Ubuntu, например, который разбивает каждую строку на пробел и поиск по регулярному выражению "не слово".Ниже мой код.но я не могу заставить его правильно выводить ноль.они выходят со всем остальным, но если вы печатаете их с помощью 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

1 Ответ

5 голосов
/ 01 марта 2012

Строка '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? возвращает true или false, поэтому вам не нужно сравнивать его возвращаемое значение с trueи false, достаточно 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
...