Как получить имя файла без расширения от пути к файлу в Ruby

Предупреждение: Деление на ноль

Предупреждающее сообщение «Подразделение на ноль» является одним из наиболее часто задаваемых вопросов среди новых разработчиков PHP. Эта ошибка не вызовет исключения, поэтому некоторые разработчики иногда будут подавлять предупреждение, добавляя оператор подавления ошибок @ перед выражением. Например:

$value = @(2 / 0);

Но, как и при любом предупреждении, наилучшим подходом было бы отслеживать причину предупреждения и разрешать его. Причина предупреждения будет происходить из любого экземпляра, где вы пытаетесь разделить на 0, переменную, равную 0, или переменную, которая не была назначена (поскольку NULL == 0), потому что результат будет «неопределенным».

Чтобы исправить это предупреждение, вы должны переписать свое выражение, чтобы проверить, что значение не равно 0, если оно есть, сделать что-то еще. Если значение равно нулю, вы не должны делиться или изменять значение на 1, а затем делить так, что деление приводит к эквиваленту того, что он разделен только дополнительной переменной.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Вопросы, относящиеся:

228
задан the Tin Man 29 April 2016 в 12:56
поделиться

6 ответов

require 'pathname'

Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>

я не был пользователем Windows в долгое время, но Путь rdoc говорит, что не имеет никаких проблем с разделителями имени каталога в Windows.

93
ответ дан NobodyNada - Reinstate Monica 23 November 2019 в 03:44
поделиться

Попробуйте File.basename

Возвраты последний компонент имени файла, данного в file_name, который должен быть сформирован с помощью наклонных черт вправо (' '/’’) независимо от разделителя, используемого в локальной файловой системе. Если суффикс дан и существует в конце file_name, он удален.

File.basename("/home/gumby/work/ruby.rb")          #=> "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"

В Вашем случае:

File.basename("C:\\projects\\blah.dll", ".dll")  #=> "blah"
581
ответ дан Jonathan Lonowski 23 November 2019 в 03:44
поделиться

В случае, если расширение не известно (ему нужно / разделитель):

irb(main):024:0> f = 'C:\foobar\blah.txt'.gsub("\\","/")
=> "C:/foobar/blah.txt"
irb(main):027:0> File.basename(f,File.extname(f))
=> "blah"
56
ответ дан Vinko Vrsalovic 23 November 2019 в 03:44
поделиться

Ответ Jonathon лучше, но сообщать somelist[-1] - один из эти LastIndexOf доступные нотации.

, Поскольку krusty.ar упомянул somelist.last, по-видимому, также.

irb(main):003:0* f = 'C:\\path\\file.txt'
irb(main):007:0> f.split('\\')
=> ["C:", "path", "file.txt"]
irb(main):008:0> f.split('\\')[-1]
=> "file.txt"
8
ответ дан the Tin Man 23 November 2019 в 03:44
поделиться

Обратите внимание, что строки двойных кавычек выходят из \.

'C:\projects\blah.dll'.split('\\').last
4
ответ дан krusty.ar 23 November 2019 в 03:44
поделиться

Если у вас есть доступ к переменным ENV, сканирование в сочетании с этим маленьким регулярным выражением (которое находит предпоследнее слово, точку, а затем последнее слово строки) поместит имя файла в 'filename':

filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)

Очевидно, вы можете использовать scan и регулярное выражение для любого пути, который включает имя файла, и __ FILE __ является очевидным выбором:

__FILE__.scan(/\w+\.\w+$/)
0
ответ дан 23 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: