use Getopt::Long;

use Getopt::Std::getopts; - ihirokyの日記に続いてLongバージョンの概要。Perl スクリプトでのコマンドラインオプション処理を参考にした。
=sは文字列で、=iは整数らしい。

#!/usr/bin/perl -w

use strict;
use Getopt::Long;

my %opts = ( # デフォルト値
        'baddr1' => '10.0.0.1',
        'baddr2' => '10.0.0.2',
        'mcport' => 12345,
        'mcprompt' => 'prompt',
        'cport'  => 23456,
        'dport'  => 34567
);

GetOptions(\%opts, 'baddr1=s', 'baddr2=s',
        'mcport=i', 'mcprompt=s', 'cport=i', 'dport=i');

while (my ($k,$v) = each(%opts)) {
        printf "%s : %s\n", $k, $v;
}

foreach my $arg (@ARGV) {
        print "arg : $arg\n";
}

実行

$ ./getoptlong.pl --baddr1 10.0.1.1 --baddr2 10.0.1.2 --mcport 1111 --mcprompt prop --cport 3333 --dport 4444 hoge foo bar
mcprompt : prop
cport : 3333
baddr2 : 10.0.1.2
baddr1 : 10.0.1.1
dport : 4444
mcport : 1111
arg : hoge
arg : foo
arg : bar

オプションじゃない普通の引数はどこにあっても良いらしい。

$ ./getoptlong.pl --baddr1 10.0.1.1 --baddr2 10.0.1.2 --mcport 1111 --mcprompt p
rop --cport 3333 bar --dport 4444 hoge foo
mcprompt : prop
cport : 3333
baddr2 : 10.0.1.2
baddr1 : 10.0.1.1
dport : 4444
mcport : 1111
arg : bar
arg : hoge
arg : foo

=sをとってみたり、=iのところに文字列を持ってきたりする。baddr1はおかしくなってるし、=iのところは警告が出てる。

GetOptions(\%opts, 'baddr1', 'baddr2=s',
        'mcport=i', 'mcprompt=s', 'cport=i', 'dport=i');
$ ./getoptlong.pl --baddr1 10.0.1.1 --baddr2 10.0.1.2 --mcport hoge --mcprompt p
rop --cport 3333 --dport 4444
Value "hoge" invalid for option mcport (number expected)
mcprompt : prop
cport : 3333
baddr2 : 10.0.1.2
baddr1 : 1
dport : 4444
mcport : 12345