#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"]
(Печатает без расширения, удаленного для пробелов, но они печатают без расширения в верхнем регистре.)