hns - 日記自動生成システム - Version 2.19.9

先月 2007年09月 来月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Namazu for hns による簡易全文検索
詳しくは 詳細指定/ヘルプを参照して下さい
検索式:

2007年09月09日() 旧暦 [n年日記] [更新:"2007/09/12 09:50:57"]

#1 [Perl] Getopt::Std の使い方 (use strict)

以前にも ちょっと書いた ことがある Getopt::Std; の使い方の話。まず話がそれるが、 Emacs か vi かという話があって、それと(僕は)似た話だと思うが、 Perl 手続を書く時に、 use strict; を使う か使わないかがある気がする。 どのような時でも use strict; を使う と決めているとすると、その Getopt::Std で少し悩むかも知れない。( 参考: perldoc Getopt::Std)
use strict;
use Getopt::Std;
と書いた時の話。まず、use strict; の有無に関係ない話として、 その時に使えるようになる二つの関数の getopt() と getopts() の違い。 はじめの getopt('r'); は r に引数をとる。
./test-script -r 2
の 2 が $opt_r に入る。一方二つ目の getopts('r') は r に引数をとらない。 getopts() の方で引数をとるようにするには getopts('r:') と書く。 初めの方の getopt では、(: を付けなくても) 並べて書いた全ての文字に引数をとる。
関数引数の例その時の動作名前の覚え方
getopt'r'-r hoge の hoge が $opt_r に入る方法が一つだけなので単数形
getopts'ari:'-a や -r は、有無で $opt_a や $opt_r に 1 か 0、i: のようにコロンを付けると、-i foo の foo が $opt_i に入る二つの方式 (: の有無)があるので複数形
このようにして getopt() や getopts() は変数 $opt_文字 に値が代入される。で、 もう一つの使い方として hash の %opts 変数 を使うことも可能。
getopts('r', \%opts);
のようにしておくと %opts の $opts{'r'} に値が入る。 単数形の getopt の方が指定方法が一通り。 複数形の getopts は指定方法に二つあると覚えるのかな。 で、ここまでは use strict; とは関係なくどちらでも同じ。

use strict;:

use strict; と一緒に使う場合には、そのままだと、例えば $opt_r が宣言されて いないと言われる。
Global symbol "$opt_r" requires explicit package name at hoge line xx.
それで、使うものに応じて、次のような宣言を書いておく。
our(%opts);
our($opt_r);
%opts 方式が良いのは、全ての文字について our を書かなくても良く、一つで済むいということ。 ちなみに our は大域変数 (global variable)宣言。 つっこみをいただきましたが、%opts が良いのは、my(%opts) で済むこと(らしい)です。 ありがとうございます。

@ARGV に与えた引数が入らない:

更にもう一点注意が必要、それは @ARGV。何も考えないと、特に問題が表示されないで 「@ARGV に与えた引数が入らない」 変だなぁ、となる。これは
our(@ARGV);
の宣言を書くことで期待通り動くようになる。



最近の日記
2019年12月08日
pbulk for NetBSD 9.0_RC1
Tool dependency checkperms>=1.1: NOT found
2019年11月30日
NetBSD-9.0_RC1-amd64-install.img.gz
2019年11月25日
一回目の大根を漬けた
2019年11月08日
math/py-tables
2019年11月03日
(Wanderlust) problem reading mail メールが読めなくなって
以上、1 日分です。
タイトル一覧
カテゴリ分類
Powered by hns-2.19.9, HyperNikkiSystem Project

Count.cgi (since 2000/02/05)