Ruby,Perl,Pythonのメモ〜コマンドオプション取得方法〜

メモ:
・日本語の取り扱いのめも その2(引数・コマンドオプションについて)
・バージョンはruby 1.9.1p129,perl v5.10.0,Python 3.0.1

ruby perl python
ライブラリ OptionParser Getopt::Long英語
Getopt::Long日本語
optparse英語
optparse日本語
文字コード localeのまま取得?
(でもwarning出る)
内部で変換 locale→Unicode文字列に自動変換?

rubyのwarning回避方法は今のところ不明。わかれば追記する。



ソースコードutf-8、コンソール:utf-8

Ruby

#!/usr/local/bin/ruby
# coding: utf-8

require 'optparse'
opts = {}
ARGV.options {|opt|
  opt.on('-n name','--name','オプションの説明') {|name| opts[:name] = name }
  opt.parse!
}
if opts[:name] then
  puts "name=#{opts[:name]} name.encoding=#{opts[:name].encoding}"
end

# オプション以外の引数
puts "引数の数 = #{ARGV.length}"
puts "引数 = #{ARGV}"

結果

$ ./jpSrc.rb 日本語 -n 日本語
/usr/local/lib/ruby/1.9.1/optparse.rb:1262: warning: regexp match /.../n against to UTF-8 string
/usr/local/lib/ruby/1.9.1/optparse.rb:1278: warning: regexp match /.../n against to UTF-8 string
/usr/local/lib/ruby/1.9.1/optparse.rb:326: warning: regexp match /.../n against to UTF-8 string
name=日本語 name.encoding=UTF-8
引数の数 = 1
引数 = ["日本語"]
$ ./jpSrc.rb -h
Usage: jpSrc [options]
    -n, --name name                  オプションの説明


Perl

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use feature ":5.10";
use Getopt::Long;
use Encode;

my %opts = ();
GetOptions(\%opts, 'help', 'name=s');

binmode(STDOUT, ':utf8' );

if( $opts{help} ){
  say "Usage: $0 [options]";
  say "  -n, --name name  オプションの説明";
  exit 0;
}
if( $opts{name} ){
  my $utf_name =  Encode::decode('utf8',$opts{name});
  say "name = $utf_name";
}

# オプション以外の引数
say "引数の数 = ".@ARGV;
my @encode_argv = map { Encode::decode('utf8',$_) } @ARGV;
say "引数 = @encode_argv";

結果

$ ./jpSrc.pl 日本語 -n 日本語
name = 日本語
引数の数 = 1
引数 = 日本語
$ ./jpSrc.pl -h
Usage: ./jpSrc.pl [options]
  -n, --name name  オプションの説明

Python

#!/usr/local/bin/python3.0
# /usr/bin/python3.0
# -*- coding: utf-8 -*-
from optparse import OptionParser

parser = OptionParser()
parser.add_option("-n", "--name", dest="name",
                  help="オプションの説明", metavar="string")
(options, args) = parser.parse_args()
print("options=" ,options)

# オプション以外の引数
print("引数の数 =" , len(args))
print("引数 =" , args)

結果

$ ./jpSrc.py 日本語 -n 日本語
options= {'name': '日本語'}
引数の数 = 1
引数 = ['日本語']
$ ./jpSrc.py -h
Usage: jpSrc.py [options]

Options:
  -h, --help            show this help message and exit
  -n string, --name=string
                        オプションの説明