コード溜め

備忘録的コンピュータ日記

[perl,C]$#ARGVとint argcの値

2005-04-27 18:12:50 | C
プログラムを書いていていつも分からなくなる…。perlとCを行ったり来たりするせいだ。

コマンド実行時のコマンドライン引数の個数の調べ方。

・perlの場合($#ARGV)
@ARGV配列の最後のインデックス(添え字)が入る。
かつ、@ARGVはコマンドラインの引数のみが入る。つまり、実際の引数の数-1。
(プログラム名は入らない。これを調べるときは$0または$PROGRAM_NAMEをつかう。)


・Cの場合(main(int argc, char *argv[]))
argcにはargv配列の個数が入る
そしてargv[0]には、そのプログラム名が入る。つまり、実際の引数の数+1


ちなみにperlの$0変数は、スクリプトから変更することが可能で、変更するとpsコマンドなどで表示するプログラム名が変化するそうだ。

perl 5.8とjperlで同一の日本語用スクリプトを使いまわす

2005-04-10 17:14:56 | perl
ホームディレクトリを多数のマシンが共有するような環境で使う場合のTip。
5.8系では先頭に use encoding 'euc-jp'としてencodingパッケージにより、スクリプトファイルの自体のエンコーディングが指定ができるが(というか指定しないとutf8のファイルだと思われてしまう)、perlバージョンがjperlの場合use encodingするとエラーになる(5.8以前なのでこのパッケージを持っていない)。これを回避しつつスクリプトを共有する方法。

なお、open.pmの部分は、open関数や通常の関数で開くファイルの漢字コードをeuc-jpに指定する方法。(たぶん、こっちのほうが情報として有益と思われる)
use English qw/ $PERL_VERSION /;
BEGIN {
    if( $PERL_VERSION >= 5.008 ){
         #perl 5.8
         require encoding;
         encoding->import( "euc-jp" );
         require "open.pm";
         open::import(IO, ":encoding(euc-jp)");
    } elsif( split( //, "字" ) == 1 ){
         #perl vesrion 5?
         require I18N::Japanese;
         I18N::Japanese->import();
    } else {
         #jperl
#	die "Can't Handling Japanese char";
    }
}


参考:http://namazu.org/~tsuchiya/perl/perl-5.8.html