Действительно Дешевый парсинг параметра командной строки в Ruby

У меня Windows 8.1, и у меня тоже была эта проблема. Мой учитель сказал мне, что это, вероятно, потому что мой сервер MySQL перестал работать. Она сказала мне, чтобы я зашел в утилиту «Управление компьютером» (щелкните правой кнопкой мыши в нижнем левом углу экрана в Windows 8.1, чтобы получить доступ к управлению компьютером). Затем в разделе «Службы и приложения» откройте Службы и найдите MySQL. Вы должны иметь возможность щелкнуть правой кнопкой мыши MySQL и перезапустить его.

114
задан Curt J. Sampson 4 December 2014 в 08:27
поделиться

8 ответов

Вот стандартный метод, который я обычно использую:

#!/usr/bin/env ruby

def usage(s)
    $stderr.puts(s)
    $stderr.puts("Usage: #{File.basename($0)}: [-l <logfile] [-q] file ...")
    exit(2)
end

$quiet   = false
$logfile = nil

loop { case ARGV[0]
    when '-q' then  ARGV.shift; $quiet = true
    when '-l' then  ARGV.shift; $logfile = ARGV.shift
    when /^-/ then  usage("Unknown option: #{ARGV[0].inspect}")
    else break
end; }

# Program carries on here.
puts("quiet: #{$quiet} logfile: #{$logfile.inspect} args: #{ARGV.inspect}")
59
ответ дан 24 November 2019 в 02:28
поделиться

Вы можете попробовать что-нибудь вроде:

if( ARGV.include( '-f' ) )
  file = ARGV[ARGV.indexof( '-f' ) + 1 )]
  ARGV.delete('-f')
  ARGV.delete(file)
end
3
ответ дан 24 November 2019 в 02:28
поделиться

Я полностью понимаю, почему вы не хотите использовать optparse - его может оказаться слишком много. Но есть несколько гораздо более «легких» решений (по сравнению с OptParse), которые поставляются в виде библиотек, но достаточно просты, чтобы сделать установку одного гема стоящей.

Например, посмотрите этот пример OptiFlag . Всего несколько строк на обработку. Слегка усеченный пример для вашего случая:

require 'optiflag'

module Whatever extend OptiFlagSet
  flag "f"
  and_process!
end 

ARGV.flags.f # => .. whatever ..

Есть тонны индивидуальных примеров . Я помню, как использовал другой, который был еще проще, но пока он ускользнул от меня, но я вернусь и добавлю здесь комментарий, если найду его.

8
ответ дан 24 November 2019 в 02:28
поделиться

Троллоп довольно дешевый.

2
ответ дан 24 November 2019 в 02:28
поделиться

Вы считали Тора вайкатами? Я думаю, что это намного чище, чем optparse. Если у вас уже есть сценарий, может потребоваться дополнительная работа по его форматированию или рефакторингу для Thor, но он делает параметры обработки очень простыми.

Вот пример фрагмента из README:

class MyApp < Thor                                                # [1]
  map "-L" => :list                                               # [2]

  desc "install APP_NAME", "install one of the available apps"    # [3]
  method_options :force => :boolean, :alias => :optional          # [4]
  def install(name)
    user_alias = options[:alias]
    if options.force?
      # do something
    end
    # ... other code ...
  end

  desc "list [SEARCH]", "list all of the available apps, limited by SEARCH"
  def list(search = "")
    # list everything
  end
end

Thor автоматически отображает команды как таковой:

app install myname --force

Это преобразуется в:

MyApp.new.install("myname")
# with {'force' => true} as options hash
  1. Наследовать от Thor, чтобы превратить класс в средство сопоставления опций
  2. Сопоставить дополнительные недействительные идентификаторы с определенными методами. В этом случае преобразуйте -L в: list
  3. Опишите метод непосредственно ниже. Первый параметр - это информация об использовании, а второй - описание.
  4. Укажите любые дополнительные параметры. Они будут собраны из - и - params. В этом случае добавляются опции --force и -f.
3
ответ дан 24 November 2019 в 02:28
поделиться

Я разделяю ваше отвращение к require 'getopts' , в основном из-за того, насколько хорош OptionParser :

% cat temp.rb                                                            
require 'optparse'
OptionParser.new do |o|
  o.on('-d') { |b| $quiet = b }
  o.on('-i') { |b| $interactive = b }
  o.on('-f FILENAME') { |filename| $filename = filename }
  o.on('-h') { puts o; exit }
  o.parse!
end
p :quiet => $quiet, :interactive => $interactive, :filename => $filename
% ruby temp.rb                                                           
{:interactive=>nil, :filename=>nil, :quiet=>nil}
% ruby temp.rb -h                                                        
Usage: temp [options]
    -d
    -i
    -f FILENAME
    -h
% ruby temp.rb -d                                                        
{:interactive=>nil, :filename=>nil, :quiet=>true}
% ruby temp.rb -i                                                        
{:interactive=>true, :filename=>nil, :quiet=>nil}
% ruby temp.rb -di                                                       
{:interactive=>true, :filename=>nil, :quiet=>true}
% ruby temp.rb -dif apelad                                               
{:interactive=>true, :filename=>"apelad", :quiet=>true}
% ruby temp.rb -f apelad -i                                              
{:interactive=>true, :filename=>"apelad", :quiet=>nil}
76
ответ дан 24 November 2019 в 02:28
поделиться

Как автор Trollop , я не могу поверить в то, что люди считают разумным в парсере опций. Шутки в сторону. Это поражает воображение.

Зачем мне нужно делать модуль, который расширяет какой-то другой модуль для анализа параметров? Зачем мне что-то подклассифицировать? Почему я должен подписываться на какую-то «структуру» только для того, чтобы разбирать командную строку?

Вот версия вышеупомянутого Trollop:

opts = Trollop::options do
  opt :quiet, "Use minimal output", :short => 'q'
  opt :interactive, "Be interactive"
  opt :filename, "File to process", :type => String
end

И все. opts теперь является хешем с ключами : quiet , : interactive и : filename . Вы можете делать с ним все, что хотите. И вы получите красивую страницу справки, отформатированную под ширину экрана, автоматические короткие имена аргументов, проверку типов ... все, что вам нужно.

Это один файл, так что вы можете поместить его в свой каталог lib /, если вам не нужна формальная зависимость. Он имеет минимальный DSL, который легко подобрать.

LOC на опционов. Это важно.

233
ответ дан 24 November 2019 в 02:28
поделиться

Видимо, мы с Уильямом Морганом думаем одинаково. Я только вчера вечером выпустил на Github то, что сейчас вижу, похожее на библиотеку Trollop (Named how?) после того, как провел поиск OptionParser на Github, смотрите Switches

There's a few differences, but the philosophy is same. Одно из очевидных различий состоит в том, что Switches зависит от OptionParser.

0
ответ дан 24 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

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