[解決済み] Rubyで本当に安いコマンドラインオプションのパース
質問
編集: お願いします。 をお願いします。 , をお願いします。 は、返信する前に、この投稿の下部に記載されている2つの要件を読んでください。人々は、明らかに要件を満たしていない彼らの新しい宝石やライブラリや何物かを投稿し続けています。
時々、簡単なスクリプトにいくつかのコマンドライン オプションを非常に安価にハックしたいと思います。getopts やパース、またはそのようなものを扱うことなく、それを行う楽しい方法は、次のとおりです。
...
$quiet = ARGV.delete('-d')
$interactive = ARGV.delete('-i')
...
# Deal with ARGV as usual here, maybe using ARGF or whatever.
これは通常の Unix オプション構文とは異なり、" のようなオプション以外のコマンドラインパラメータを受け付けるからです。
myprog -i foo bar -q
のように、オプション以外のコマンド ライン パラメータを受け入れるため、通常の Unix オプション構文とは異なりますが、私はこれに耐えることができます。(Subversionの開発者のように、これを好む人もいます。時々私もそうします)。
存在するかしないかだけのオプションは、上記よりもはるかに単純に実装することができません。(1つの代入、1つの関数呼び出し、1つの副作用。) " のようなパラメータを取るオプションを扱う、同様にシンプルな方法はありますか?
-f
ファイル名
"?
EDITです。
トロロップの作者が「ライブラリは 1 つの [800 行] ファイルに収まる」と言及するまでわからなかったので、先ほどは言わなかったのですが、私はきれいな構文だけでなく、次のような特徴を持つ手法も求めています。
-
コードの全体をスクリプト ファイルに含めることができる (実際のスクリプト自体は数十行に過ぎないかもしれませんが、それを圧倒することなく)、1 つのファイルを
bin
ディレクトリにドロップして使うことができます。もし、require 文がなく、いくつかのオプションを解析するコードが数十行以下であるような Ruby スクリプトを書けないのであれば、この要件は不合格です。 -
コードは、どこか他の場所からカットアンドペーストするのではなく、トリックを実行するコードを直接入力するために、そのコードを十分に記憶できるほど小さく、シンプルであることです。インターネットにアクセスできないファイアウォールで保護されたサーバーのコンソールにいて、クライアントが使用するスクリプトをすばやく作成したい状況を考えてみてください。あなたのことは知りませんが、(上記の要件を満たせないことに加えて) 簡略化したマイクロオプトパースの 45 行を記憶することさえ、私には気にならないことなのです。
どのように解決するのですか?
私がいつも使っている標準的なテクニックを紹介します。
#!/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}")
関連
-
[解決済み] Rubyで複数行のコメント?
-
[解決済み] RubyでJSON文字列をパースする
-
[解決済み】rakeタスクにコマンドライン引数を渡す方法
-
[解決済み】Ruby: 複数行の文字列を連結せずに書くことはできますか?
-
[解決済み】コマンドラインからRubyスクリプトに変数を渡す。
-
[解決済み】RubyにあってPythonにないもの、またその逆は何ですか?
-
[解決済み] JSONファイルへの正しい書式での書き込み方法
-
[解決済み] Rubyにおけるtapメソッドの利点
-
[解決済み] Ruby: HTTP でファイルを multipart/form-data で投稿するには?
-
[解決済み] ルビー 負の数を正の数に変換する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜsumはinject(:+)よりもずっと速いのですか?
-
[解決済み] Rubyの理想的なプロジェクト構造
-
[解決済み] rvm use 2.0.0 --default を実行すると、"Warning! PATH is not properly set up" と表示される。
-
[解決済み] ハッシュの配列をハッシュの値でソートするにはどうしたらいいですか?
-
[解決済み] 文字列を正規表現に変換する ruby
-
[解決済み] Ubuntu 14.04にRuby 2.1.4をインストールする方法
-
[解決済み] Rubyで「逆レンジ」を繰り返し処理できないのはなぜですか?
-
[解決済み] ruby システムコマンドの終了コードチェック
-
[解決済み] rubyのinjectはreduceと同じ意味ですか?
-
[解決済み] Ruby: selfを拡張する