2010年09月23日

近いうちに水性ペンを買います。(挨拶)

コマンドライン引数を処理するモジュールっていっぱいありますね!ありすぎてどれがいいかよくわからないし、「まぁぶっちゃけ Getopt::Long さえあれば大体いいよね!コアだし!」って感じですが、まぁなんか書いた。

 xaicron's p5-Getopt-Compact-WithCmd at master - GitHubはてブ

App::Cmdとかありますが、あれはモジュール化しなきゃいけなくて、大変めんどうです。*1
俺は一枚のスクリプトに書きたいんだ!!

特徴

  • サブコマンド前提
  • usage は自動生成
  • default や required の指定が可能
  • 依存が少ない(かも)*2

という感じです。最初は、Getopt::Compactを継承して書いてたんですが、途中からなんかあびゃーってなったのでやめました。使い方は大体一緒ですが。

Getopt::Comactに関しては↓が詳しいです

 コマンドラインオプションを解析するPerlモジュールGetopt::Compact | おいぬま日報はてブ

サブコマンドってなんぞ

なんか

$ git add foobar.baz

addのこと

使い方

#!/usr/bin/env activeperl

use strict;
use warnings;
use 5.12.0;
use Getopt::Compact::WithCmd;
use Data::Dumper;

my $go = Getopt::Compact::WithCmd->new(
    modes => [ qw/verbose/ ],
    global_struct => [
        [ [qw/f force/], 'force overwrite' ],
    ],
    command_struct => {
        get => {
            options => [
                [ [qw/t time_out/], 'timeout secconds', '=i', \my $timeout, { default => 5 } ],
                [ [qw/d dir/], 'save directory', '=s', undef, { required => 1 } ],
            ],
            args => 'URL',
            desc => 'get file from URL',
        },
    },
);

my $opts = $go->opts;
my $cmd  = $go->command || $go->show_usage;

&main;exit;

sub main {
    __PACKAGE__->can($cmd)->();
}

sub get {
    my $url = shift @ARGV || $go->show_usage;
    print Dumper $opts;
    say "timeout: $timeout";
    say "url: $url";
}

global_struct というのが全体で共通の option。書き方は Getopt::Compact の struct と互換がありますが、defaultrequired が指定できるようになっているので、便利だと思います。

command_struct が、それぞれのサブコマンドの定義。hash の key がそのまま、サブコマンドになって、値が設定になります。

とりあえず foo.pl として保存して実行すると

$ ./foo.pl
usage: foo.pl [options] COMMAND

options:
   -h, --help      This help message
   -v, --verbose   Verbose mode
   -f, --force     Force overwrite

Implemented commands are:
   get   Get file from URL

See 'foo.pl help COMMAND' for more information on a specific command.

とかなって、指定できるオプションや、定義されているコマンドが出てきていい感じですね。

さらに、help コマンドが自動的に作られるので、

$ ./foo.pl help get
usage: foo.pl get [options] URL

options:
   -h, --help       This help message
   -v, --verbose    Verbose mode
   -t, --time_out   Timeout secconds
   -d, --dir        Save directory

とかやると、get サブコマンドの usage が出てきます。
単に ./foo.pl help すれば、全体のヘルプが表示され、./foo help COMMAND すれば、それぞれのヘルプが表示されるようになっています。

あと、show_usage というメソッドがはえてて*3、これを使うと、usage を表示して exit してくれます。

さらに、--dir を required にしたので、指定しないと怒られます。

$ ./foo.pl get http://example.com/foobar
`--dir` option must be specified
usage: foo.pl get [options] URL

options:
   -h, --help       This help message
   -v, --verbose    Verbose mode
   -t, --time_out   Timeout secconds
   -d, --dir        Save directory

ちゃんと指定すると

$ ./foo.pl get -d . http://example.com/foobar
$VAR1 = {
          'verbose' => undef,
          'help' => undef,
          'dir' => '.',
          'force' => undef
        };
timeout: 5
url: http://example.com/foobar

となって、無事に値がとれました。

ちなみに、--force オプションは、grobal_struct で定義されているので、サブコマンドの前にしか指定できません。*4

つまり、

$ ./foo.pl --force get -d . http://example.com/foobar

はいいけど、

$ ./foo.pl get -d . http://example.com/foobar --force

はだめってことです。

まとめ

option の指定と usage を同時に出来るのはもちろん、サブコマンドごとの option も分けられるので、そこそこ凝ったことができると思います。

一枚のスクリプトでサブコマンドも処理したいお!って人はお使いください。

  • *1 : つまりインストール前提
  • *2 : 依存は、今のところ、Text::Tableのみ
  • *3 : 上でも使ってますが
  • *4 : git も同じ感じ
xaicron at 21:09コメント(83)Perl   このエントリーをはてなブックマークに追加
編集

コメント一覧

1. Posted by kata cinta   2013年12月21日 03:31

この記事は非常に良いですが、それでは書き続けるし、うまくいけば、このブログが成功になりましょう!
2. Posted by oke seo   2014年02月22日 04:01
これは良いニュースですが、私は読んでいる
3. Posted by diakui   2014年02月26日 08:08
このウェブサイトの私の忠実な読者と再び会うおはようございます!
4. Posted by cara menghilangkan jerawat   2014年03月09日 22:33
本当に良い品は、私がこのブログであることが幸せです。
5. Posted by kata kata cinta   2014年03月09日 22:33
本当に良い品は、私がこのブログであることが幸せです。
6. Posted by dp bbm bergerak   2014年03月27日 15:26
これは良いニュースですが、私は読んでいる
7. Posted by gambar bergerak   2014年03月27日 15:30
私は、非常に有用な記事のすべてを読むことが幸せです。私はこのブログであることが幸せです。
8. Posted by kata kata romantis   2014年04月02日 05:48
私はあなたが提示情報を愛するの上、上記の情報を共有していただきありがとうございます
9. Posted by kata kata cinta   2014年04月21日 22:11
私は、非常に有用な記事のすべてを読むことが幸せです。私はこのブログであることが幸せです。
10. Posted by Cerita Lucu   2014年04月24日 15:31
このウェブサイトの私の忠実な読者と再び会うおはようございます!
11. Posted by tempat wisata di bandung   2014年05月08日 02:41
これは実際に読むことは非常に興味深い記事です!
更新された場合に、より良く、より面白いかもしれ
12. Posted by blog remaja indonesia   2014年05月11日 04:43
私はあなたが提示情報を愛するの上、上記の情報を共有していただきありがとうございます
13. Posted by operatorku   2014年05月12日 19:05
私はあなたのブログ、非常に良い記事と非常に便利であることがとてもうれしいです
14. Posted by operatorku.com   2014年05月20日 06:47
私はあなたのブログ、非常に良い記事と非常に便利であることがとてもうれしいです
15. Posted by kata kata indah   2014年05月31日 16:59
私はあなたのブログ、非常に良い記事と非常に便利であることがとてもうれしいです。
16. Posted by dunia remaja   2014年06月04日 08:56
私はあなたが提示情報を愛するの上、上記の情報を共有していただきありがとうございます
17. Posted by kata kata cinta   2014年06月04日 20:19
これは良いニュースですが、私は読んでいる
18. Posted by pembaca   2014年06月10日 19:28
私はこのブログの記事を読みましたし、私の知識は非常に有用であり、私はこのブログが大好きです。
19. Posted by kata kata cinta romantis   2014年06月11日 02:33
非常に素晴らしいのニュース、インドネシアの国民の成功を読み、挨拶、私たちへの書き込みをありがとうございました
20. Posted by kata kata mutiara   2014年06月16日 05:34
ありがとうございます、あなたの文章が読み、非常に良いと面白いです
21. Posted by kata kata bijak   2014年06月16日 10:26
このブログに興味深い記事が、私はこのブログであることがとてもうれしいです。
22. Posted by kata kata cinta   2014年06月19日 08:06
非常に興味深い記事、私はこの記事を投稿してくれてありがとう、私は最新の記事を待っています、それを読むことは非常に満足しています。
23. Posted by kata kata galau   2014年06月26日 16:20
私はあなたが提示情報を愛するの上、上記の情報を共有していただきありがとうございます
24. Posted by dunia remaja   2014年07月08日 20:43
にひりずむ::しんぷる - わーい、JSX で canvas いじれたよー
25. Posted by resep kue   2014年07月14日 02:55
素晴らしい記事、ありがとうございました
26. Posted by kumpulan kata kata cinta romantis buat pacar   2014年07月21日 12:18
非常に記事ここに有用な情報をたくさん見つける幸いです
27. Posted by WilliamRhip   2014年07月26日 19:56
5 http://www.make-money-2013.com,エレキギター初心者セット
http://www.make-money-2013.com, アコースティックギター
http://www.make-money-2013.com, エレアコギター
http://www.make-money-2013.com,ギターアクセサリ
http://www.make-money-2013.com,エレキギター
http://www.make-money-2013.com, ギターエフェクター
<a href=http://www.make-money-2013.com>エレキギター初心者セット</a>
<a href=http://www.make-money-2013.com>アコースティックギター</a>
<a href=http://www.make-money-2013.com>エレアコギター</a>
<a href=http://www.make-money-2013.com>ギターアクセサリ</a>
<a href=http://www.make-money-2013.com>エレキギター </a>
<a href=http://www.make-money-2013.com>ギターエフェクター</a>
<a href=http://www.make-money-2013.com>エレキギター初心者セット</a>
<a href=http://www.make-money-2013.com>アコースティックギター</a>
<a href=http://www.make-money-2013.com>エレアコギター</a>
<a href=http://www.make-money-2013.com>ギターアクセサリ</a>
<a href=http://www.make-money-2013.com>エレキギター </a>
<a href=http://www.make-money-2013.com>ギターエフェクター</a>
28. Posted by kata kata cinta   2014年09月04日 23:09
この記事は非常に良いですが、それでは書き続けるし
29. Posted by kumpulan kata kata cinta terbaru untuk pacar   2014年09月15日 00:20
おまえらさぁ、なに簡単に煽られてんだよ。
30. Posted by kata kata galau   2014年09月20日 13:55
このウェブサイトの私の忠実な読者と再び会うおはようございます! !!
31. Posted by kata kata mutiara   2014年09月22日 16:36
非常に良いニュース、そして興味深い観察する
32. Posted by jasa fotocopy murah   2014年09月25日 18:58
書き込みは、注意することは興味深い
33. Posted by tempat fotocopy dan percetakan murah di jakarta   2014年09月26日 22:11
注意することは興味深く、良いニュースは、ありがとう
34. Posted by kata kata gombal   2014年09月27日 17:05
面白いポストと品質のウェブサイトは..成功に関して
35. Posted by pakar seo   2014年10月02日 22:35
良いニュースと面白い、ありがとう
36. Posted by kata kata galau   2014年10月03日 17:08
このブログに興味深い記事が私はこのブログであることがとてもうれしいです。
37. Posted by ucapan selamat ulang tahun   2014年10月03日 20:08
これ以上の興味深い最新のニュースの更新
38. Posted by cetak yasin   2014年10月12日 21:54
ジャカルタの場所印刷とブック安いヤシンレター
39. Posted by 白 水着・ビキニ   2014年10月18日 07:39
い17と
40. Posted by uda rino   2014年10月24日 03:17
ジャカルタの安いコピーや印刷の専門家
41. Posted by kata kata galau   2014年10月25日 02:42
これは良いニュースですが、私は読んでいる
42. Posted by kata kata galau sedih   2014年11月01日 03:55
観察する良いニュースと面白い
43. Posted by kata kata galau sedih   2014年11月01日 03:55
観察する良いニュースと面白い
44. Posted by kata kata bijak   2014年11月14日 20:37
賢明に言葉はいつも私たちに多くの視点を行います
45. Posted by kata kata galau   2014年12月08日 05:08
書き込みは、注意することは興味深い
46. Posted by hadirkanlah   2014年12月12日 22:27
このブログに興味深い記事が、私はこのブログ
47. Posted by kata kata galau   2014年12月13日 08:30
面白いポストと品質のウェブサイトは..成功に関し
48. Posted by batu akik   2015年01月31日 15:40
このような何かを書くために時間を割いていただき、ありがとうございます。
49. Posted by ナイトガウン   2015年02月03日 12:29
い17と真を見るの気持がスマイるの気持がスマイメージ513年
50. Posted by ブラジャー 通販   2015年02月05日 08:52
スマイメージ513年真を見るの気持がスマ
51. Posted by Nantikanlah   2015年03月26日 13:44
これは実際に読むことは非常に興味深い記事です!
52. Posted by KATA KATA TERLENGKAP   2015年03月31日 23:28
このブログに興味深い記事が、私はこのブログであることがとてもうれしいです。
53. Posted by Kata Kata Cinta   2015年04月28日 12:55
私たちは、このポストを得るために取る読んで概説ポイントを実装する必要があります。
非常に良い記事と非常に便利であることがとてもうれしいです...
55. Posted by Baby Shower Invitations Wording   2015年10月31日 05:57
ほらね〜ダウン症だったら産むのこわいって
色々障害ってあるのにこうだ、そんなんこわいなら子供作るな、少子化解消にはならんだろう、
56. Posted by Percetakan Online   2015年11月12日 01:46
非常に良い記事と非常に便利であることがとてもうれしいです...
57. Posted by Kata Kata Mutiara Cinta   2016年01月28日 10:13
それでは書き続けるし、うまくいけば、このブログが成功になりましょう!
58. Posted by Kata Kata Remaja   2016年03月07日 23:48
本当に良い品は、私がこのブログであることが幸せです。
59. Posted by cetak yasin online   2016年03月30日 22:11
ほらね〜ダウン症だったら産むのこわいって
色々障害ってあるのにこうだ、そんなんこわいなら子供作るな、少子化解消にはならんだろう
60. Posted by Jasa Percetakan dan Jasa Fotocopy Murah 24 Jam Rawamangun Jakarta   2016年04月01日 00:06
私は、非常に有用な記事のすべてを読むことが幸せです。私はこのブログであることが幸せです。
61. Posted by Kata Kata Remaja   2016年04月11日 23:43
ほらね〜ダウン症だったら産むのこわいって
色々障害ってあるのにこうだ、そんなんこわいなら子供作るな、少子化解消にはならんだろう、
62. Posted by Status Kata   2016年05月08日 22:37
この記事のために良いこと、私はそれを追加しました
63. Posted by Kata Kata Remaja   2016年05月11日 01:01
共有のおかげで、この素晴らしい記事、うまくいけば、この口コミは役に立ちました、私たちのすべてのために有用であり得ます!!!!
64. Posted by Kata Kata Remaja   2016年06月09日 05:14
私は、非常に有用な記事のすべてを読むことが幸せです。私はこのブログであることが幸せです。
65. Posted by creditos con asnef   2016年06月12日 19:48
4 共有するためのおかげで
私は、非常に有用な記事のすべてを読むことが幸せです。私はこのブログであることが幸せです。
67. Posted by Kata Kata Remaja   2016年07月30日 04:42
私は、非常に有用な記事のすべてを読むことが幸せです。私はこのブログであることが幸せです。
68. Posted by Kata Kata Mutiara   2016年08月04日 03:49
私は、非常に有用な記事のすべてを読むことが幸せです。私はこのブログであることが幸せです。
69. Posted by Kata Kata Cinta   2016年09月22日 16:43
この記事のために良いこと、私はそれを追加しました
70. Posted by Kata Kata Galau   2016年10月02日 23:46

この記事は非常に良いですが、それでは書き続けるし、うまくいけば、このブログが成功になりましょう!
71. Posted by Cetak Murah Rawamangun Jakarta Timur   2016年10月12日 04:17
書き込みは、注意することは興味深い
72. Posted by Kata Kata Bijak   2016年10月13日 17:42
共有のおかげで、この素晴らしい記事、うまくいけば、この口コミは役に立ちました、私たちのすべてのために有用であり得ます!!!!
73. Posted by Blog Remaja Indonesia   2016年10月21日 02:01
私は、非常に有用な記事のすべてを読むことが幸せです。私はこのブログであることが幸せです。
74. Posted by iklanluki   2017年06月07日 12:39
私はあなたの記事で有用な知識を見つけます
75. Posted by MURNI JAYA Printing   2017年09月27日 10:37
らね〜ダウン症だったら産むのこわいって
色々障害ってあるのにこうだ、そんなんこわいなら子供作るな、
この記事は非常に良いですが、それでは書き続けるし、うまくいけば、このブログが成功になりましょう!
77. Posted by PERCETAKAN ANGKASA GRAFIKA   2017年12月12日 00:44
共有のおかげで、この素晴らしい記事、うまくいけば、この口コミは役に立ちました、私たちのすべてのために有用であり得ます!!!!
78. Posted by DJ HENDRA R   2018年02月04日 01:00
私は、非常に有用な記事のすべてを読むことが幸せです。私はこのブログであることが幸せです。
79. Posted by Catatan Siswa   2018年02月13日 22:00
このブログは素晴らしいです。 私はこのブログの最新記事を待つことはできません。
80. Posted by Cara Manual   2018年04月05日 16:29
5 私はこの記事を読んでうれしく、非常に興味深く有益で、共有してくれてありがとう、私は次の更新を待つ。
81. Posted by Free Download Lagu Mp3 Dugem House Music Nonstop Remix Terbaru   2018年06月06日 03:07
共有のおかげで、この素晴らしい記事、うまくいけば、この口コミは役に立ちました、私たちのすべてのために有用であり得ます!!!!
82. Posted by Print Percetakan Fotocopy Murah Dan Cepat Layanan 24 Jam Jakarta   2018年06月14日 06:14
このブログは素晴らしいです。 私はこのブログの最新記事を待つことはできません。
共有のおかげで、この素晴らしい記事、うまくいけば、この口コミは役に立ちました、私たちのすべてのために有用であり得ます!!!!

コメントする

名前:
URL:
  情報を記憶: 評価:  顔   星
  絵文字
 
 
プロフィール

Perlが少しだけ出来る気になってます。
JavaScriptはよくわかりません。
Rubyもちんぷんかんぷんです。
Pythonは難しいです。
ActionScript勘弁してください。
Javaあばばばばば。
低級言語できません。

github
記事検索
  • ライブドアブログ