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回避方法は今のところ不明。わかれば追記する。
#!/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 オプションの説明
#!/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 オプションの説明
#!/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
#!/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 あいうえお
#!/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 あいうえお
#!/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. Unicode と 404 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内部表現について
→というわけで、ためしたらホントに文字数になった。
#!/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")
#!/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;
#!/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記事 |
#!/usr/bin/ruby1.9 # coding: utf-8 str = "Rubyで日本語表示。" puts str
#!/usr/bin/perl use strict; use warnings; use utf8; use feature ":5.10"; binmode(STDOUT, ":utf8"); my $str = "Perlで日本語表示。"; say $str;
#!/usr/bin/python3.0 # coding: utf-8 str = "Ptyhonで日本語表示。" print(str)
#!/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
#!/usr/bin/perl use strict; use warnings; use feature ":5.10"; binmode(STDOUT, ":utf8"); my $str = Encode::decode("euc-jp","Perlで日本語表示。"); say $str;
#!/usr/bin/python3.0 # vim:fileencoding=euc-jp str = "Ptyhonで日本語表示。" print(str)
#!/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
#!/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;
#!/usr/bin/python3.0 # vim:fileencoding=utf-8 str = "Ptyhonで日本語表示。" print(str)
Ruby,Perl,Pythonのメモ〜基本的情報〜
メモ:
・2009年6月現在の情報であり、最新の情報を必ず確認する。
Ruby | Perl | Python | |
---|---|---|---|
最新メジャーバージョン | 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ポケットリファレンス |