Передача в переменной расширения файла

#ruby

#ruby

Вопрос:

Я пытаюсь передать расширение файла в качестве переменной, но, похоже, оно не работает. когда я запускаю getlist.rb(txt)

 def getlist(extension)
  file = File.new("the_list.txt", "w")
  Dir['../path/*.'  extension].each { |f| file.puts File.basename(f, '.'  extension).upcase }
end
  

В принципе, я хочу добавить любое расширение файла (txt, pdf, rb и т. Д.), И это даст мне список без имен расширений. Скрипт работает нормально, когда он жестко запрограммирован, просто не работает, когда я пытаюсь ввести переменную.

С наилучшими пожеланиями,

AZCards

Ответ №1:

Мой пример:

 def getlist(extension)
  File.open("the_list.txt", "w"){|file|
    Dir["*.#{extension}"].each { |f| 
        file << File.basename(f, File.extname(f)).upcase
        file << "n"
    }
  }
end

getlist('rb')
getlist(:rb)
  

Мои основные изменения:

  • File.open создан как новый (вы забыли file.close). С File.open и блоком закрытие выполняется автоматически.
  • Заменяет строку на #-замены. Преимущество: вы можете использовать символы при ее вызове (вы написали getlist.rb(txt) — это работает только тогда, когда txt является переменной, но я думаю, вам нужен ‘txt’)
  • Используйте расширение файла #., см. Ответ Дейвса.
  • Я добавил новые строки в результирующий файл.

Обновите на всякий случай, если вам нужно решение с несколькими расширениями и вызвать его из командной строки:

 def getlist(*extensions)
  p "*.{#{extensions.join(',')}}"
  File.open("the_list.txt", "w"){|file|
    Dir["*.{#{extensions.join(',')}}"].each { |f| 
        file << File.basename(f, File.extname(f)).upcase
        file << "n"
    }
  }
end

#getlist('rb', 'txt')
#getlist(:rb, :txt)
getlist(*ARGV)
  

Комментарии:

1. Это сработало довольно хорошо, возможно, это действительно вопрос новичка, но как мне запустить getlist(‘rb’) через командную строку? Попробовал несколько способов, но, похоже, ничего не сработало. Было бы проще, если бы я мог передать переменную таким образом, а не кодировать ее в файле getlist.rb

2. Я обновил свой ответ. Константа ARGV содержит все параметры из командной строки. После моего изменения вы можете вызвать его как ruby getlist.rb txt rb (getlist.rb — это скрипт, txt и rb — расширения (вы можете взять столько расширений, сколько захотите, — также одно)

Ответ №2:

 Dir['../path/*.'  extension].each { |f| file.puts File.basename(f, File.extname(f)).upcase }
  

Тем не менее, для меня это отлично работает и при использовании вашей исходной конкатенации строк:

 ruby-1.9.2-p0 :035 > getlist("html")
 => ["./about.html", "./epl-v10.html", "./notice.html"] 
ruby-1.9.2-p0 :037 > getlist("*")
 => ["./libcairo-swt.so", "./eclipse.ini", "./icon.xpm", "./eclipse.ini~", "./about.html", "./epl-v10.html", "./artifacts.xml", "./notice.html"] 
ruby-1.9.2-p0 :038 > getlist("ini")
 => ["./eclipse.ini"] 
  

(Печатает без расширения, удаленного для пробелов, но они печатают без расширения в верхнем регистре.)