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
                        オプションの説明

Ruby,Perl,Pythonのメモ〜コーディングスタイル〜

メモ:
・コーディングスタイルのメモ

ruby perl python
コーディングスタイル matz所属会社曰く Perl::Tidy本家
Perl::Critic本家
公式
上記の和訳
コーディングスタイル参考 matz曰く
誰か曰く
誰か曰く
Perlcriticの内容
perlcriticのwebサービス
perltidy,perlcriticの紹介
スタイル以外のネタもある
 

Ruby,Perl,Pythonのメモ〜文字コード指定してファイル読み込み〜

メモ:
・日本語の取り扱いのめも その2(ファイルオープンについて)
・バージョンはruby 1.9.1p129,perl v5.10.0,Python 3.0.1

ruby perl python
オープン File.open(filename,"r:<ファイルの文字コード>:<プログラム内の文字コード>") open $fh, "<:encoding(<ファイルの文字コード>)", $filename f = codecs.open(filename,"r",<ファイルの文字コード>)
メモ ファイルの文字コードと取得する文字列の文字コードを指定する
ファイルの文字コードのみを指定するとその文字コードの文字列を得る
ファイルの文字コードとプログラム内の文字コードを同一に指定するとwarningが出る
ファイルの文字コードを指定して、utf8フラグ付きの文字列を得る ファイルの文字コードを指定してUnicode文字列を得る
current
 ├UTF-8.file
 └eucJP.file

ファイル:utf-8、コンソール:utf-8

Ruby

#!/usr/bin/ruby1.9
# coding: utf-8


filename, encoding = "UTF-8.file", "UTF-8"
puts "filename " + filename + " encoding " + encoding
File.open(filename,"r:#{encoding}"){|f|
  data = f.read
  print data
}

filename, encoding = "eucJP.file", "eucJP"
puts "filename " + filename + " encoding " + encoding
File.open(filename,"r:#{encoding}:#{Encoding.locale_charmap}"){|f|
  data = f.read
  print data
}

結果

filename UTF-8.file encoding UTF-8
あいうえお
filename eucJP.file encoding eucJP
あいうえお

Perl

#!/usr/bin/perl
use strict;
use warnings;
use utf8;

my ($filename,$encoding) = ("UTF-8.file","UTF-8");
printf "filename=%s,encoding=%s\n", $filename, $encoding;
open my $fh, "<:encoding($encoding)", $filename or die "error!! file:$filename msg:$!";
my $data = do { local $/; <$fh> };
binmode STDOUT => 'utf8';
print $data;
close $fh;

($filename,$encoding) = ("eucJP.file","eucJP");
printf "filename=%s,encoding=%s\n", $filename, $encoding;
open $fh, "<:encoding($encoding)", $filename or die "error!! file:$filename msg:$!";
$data = do { local $/; <$fh> };
binmode STDOUT => 'utf8';
print $data;
close $fh;

結果

filename=UTF-8.file,encoding=UTF-8
あいうえお
filename=eucJP.file,encoding=eucJP
あいうえお


Python

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

filename, encoding= "UTF-8.file", "UTF-8"
print("filename " + filename + " encoding " + encoding)
f = codecs.open(filename,"r",encoding)
data=f.read()
print(data, end='')
f.close

filename, encoding= "eucJP.file", "eucJP"
print("filename " + filename + " encoding " + encoding)
f = codecs.open(filename,"r",encoding)
data=f.read()
print(data, end='')
f.close

結果

filename UTF-8.file encoding UTF-8
あいうえお
filename eucJP.file encoding eucJP
あいうえお

Ruby,Perl,Pythonのメモ〜文字コードと文字列長〜

メモ:
・日本語の取り扱いのめも その2(文字列長、バイト長について)
・バージョンはruby 1.9.1p129,perl v5.10.0,Python 3.0.1
・バージョンが古いと動かない
・ついでに 404 Blog Not Found:perl, python & ruby - chr() vs. Unicode404 Blog Not Found:perl, python & ruby - ord() vs. Unicode の情報は古いので、今の書き方を書いとく

ruby perl python
文字列長 文字コード指定が正しいなら文字数 utfフラグ付きなら文字数 code unit数(文字数でない)*1
configureで--with-wide-unicodeすれば文字数

※1ただし、コンパイル時のオプションで変えられるらしい 参照:DSAS開発者の部屋:Python2.x/3.0のunicode内部表現について
 →というわけで、ためしたらホントに文字数になった。

ファイル:utf-8、コンソール:utf-8

Ruby

#!/usr/bin/ruby1.9
# coding: utf-8

str = "\u{20B9F 308B}"
puts str
puts str.length
puts str.bytesize
puts "\u{20B9F}".ord
puts "\u{308B}".ord
puts 0x20B9F.chr("utf-8")
puts 0x308B.chr("utf-8")
puts 134047.chr("utf-8")
puts 12427.chr("utf-8")


Perl

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use feature ":5.10";
use bytes ();

binmode(STDOUT, "utf8");
my $str = "\x{20B9F}\x{308B}";
say $str;
say length $str;
say bytes::length($str);
say ord "\x{20B9F}";
say ord "\x{308B}";
say chr 0x20B9F;
say chr 0x308B;
say chr 134047;
say chr 12427;


Python

#!/usr/bin/python3.0
# coding: utf-8

str = "\U00020B9F\U0000308B"
print(str)
print(len(str))
print(len(bytes(str,"utf-8")))
print(ord("\U00020B9F"))
print(ord("\U0000308B"))
print(chr(0x20B9F))
print(chr(0x308B))
print(chr(134047))
print(chr(12427))


Perl Ruby Python --with-wide-unicode付き の結果

𠮟る
2
7
134047
12427
𠮟
る
𠮟
る

Python デフォルト(--with-wide-unicodeなし)の結果

𠮟る
3
7
134047
12427
𠮟
る
𠮟
る

Ruby,Perl,Pythonのメモ〜ソースの文字コード指定〜

メモ:
・日本語の取り扱いのめも (ソースコードについて)
・バージョンはruby 1.9.1p129,perl v5.10.0,Python 3.0.1
・バージョンが古いと動かない

ruby perl python
ソースコード コード冒頭に文字コード指定 基本的にUTF8で書く コード冒頭に文字コード指定
文字列 オブジェクト毎に文字コード定義 バイナリとUTF8フラグ付き文字列 Unicode文字列のみ
参考 bitclust
M17N の設計と実装
Encode入門
perl - use encoding; #は黒歴史
@IT記事

ファイル:utf-8、コンソール:utf-8

Ruby

#!/usr/bin/ruby1.9
# coding: utf-8

str = "Rubyで日本語表示。"
puts str


Perl

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

binmode(STDOUT, ":utf8");
my $str = "Perlで日本語表示。";
say $str;


Python

#!/usr/bin/python3.0
# coding: utf-8

str = "Ptyhonで日本語表示。"
print(str)

ファイル:euc-jp、コンソール:utf-8

Ruby

#!/usr/bin/ruby1.9
# vim:fileencoding=euc-jp

str = "Rubyで日本語表示。"
puts str.encode(Encoding.default_external)

または、

#!/usr/bin/ruby1.9
# vim:fileencoding=euc-jp

str = "Rubyで日本語表示。"
$stdout.set_encoding( Encoding.default_external, str.encoding )
puts str


Perl

#!/usr/bin/perl
use strict;
use warnings;
use feature ":5.10";

binmode(STDOUT, ":utf8");
my $str = Encode::decode("euc-jp","Perlで日本語表示。");
say $str;


Python

#!/usr/bin/python3.0
# vim:fileencoding=euc-jp

str = "Ptyhonで日本語表示。"
print(str)

ファイル:utf-8、コンソール:euc-jp

Ruby

#!/usr/local/bin/ruby
# vim:fileencoding=utf-8

str = "Rubyで日本語表示。"
puts str.encode(Encoding.default_external)

または、

#!/usr/local/bin/ruby
# vim:fileencoding=utf-8

str = "Rubyで日本語表示。"

$stdout.set_encoding( Encoding.default_external, str.encoding )
puts str


Perl

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

my $str = "Perlで日本語表示。";
say encode("euc-jp",$str);

または

#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
use feature ":5.10";

binmode(STDOUT, ":encoding(euc-JP)");
my $str = "Perlで日本語表示。";
say $str;

Python

#!/usr/bin/python3.0
# vim:fileencoding=utf-8

str = "Ptyhonで日本語表示。"
print(str)

Ruby,Perl,Pythonのメモ〜基本的情報〜

メモ:
・2009年6月現在の情報であり、最新の情報を必ず確認する。


RubyPerlPython
最新メジャーバージョン 1.9系 5.10系 3.0系
新機能について Ruby1.9.1NEWS日本語版 Perl5.10.0の新機能 What'sNewInPython3.0
本家URL Ruby本家 Perl本家 Python本家
ドキュメント Ruby本家内ドキュメント Perlドキュメント Python本家内ドキュメント
理念ぽいもの Rubyの言語仕様策定において最も重視しているのはストレスなくプログラミングを楽しむことである (Enjoy programming)」 TIMTOWTDI(there's more than one way to do it - あることをするのにいくつものやり方がある) 「誰にとっても明確な手法が,一つだけあることが好ましい(There should be one-- and preferably only one -- obvious way to do it.)」
作者 まつもとゆきひろ(matz) ラリー・ウォール グイド・ヴァンロッサム
作者インタビュー インタビュー インタビュー インタビュー
ライブラリサイト RubyGems CPAN PyPI(distutils)
ドキュメント生成 Rdoc

RD
POD pydoc
日本語サイト 日本Rubyの会Wiki 日本のPerlユーザのためのお役立ちサイト
日本のPerlユーザのためのハブサイト
Japan Perl Association
日本Pythonユーザ会
書評(初心者向け) 初めてのRuby ミニマムPerl みんなのPython
書評(中級者向け) プログラミング言語Ruby モダンPerl入門 初めてのPython
書評(その他) Ruby逆引きハンドブック Perlベストプラクティス Pythonポケットリファレンス