ハッシュの要素に対して用いると、value が定義されているか否かを返すもので
あって、ハッシュに key が存在するか否かを返すのではありません。これには、
exits()
を使ってください。
例:
print if defined $switch{'D'}; print "$val\n" while defined($val = pop(@ary)); die "Can't readlink $sym: $!" unless defined($value = readlink $sym); eval '@foo = ()' if defined(@foo); die "No XYZ package defined" unless defined %_XYZ; sub foo { defined &$bar ? &$bar(@_) : die "No bar"; }
undef()
も参照してください。
undump
プログラムを使って実行ファイルに返る
ことができます。この新しいバイナリが実行されると、goto LABEL
から
始めます (goto
に関する制限はすべて適用されます)。コアダンプをは
さんで再生する goto
と考えてください。$var{label} が省略されると、
プログラムを先頭から再開します。警告: dump
時点でオープンされてい
たファイルは、プログラムが再生されたときには、もはやオープンされていませ
ん。Perl を部分的に混乱させる可能性があります。$xref{実行とオプション}の
`-u' オプションも参照してください。
例:
#!/usr/bin/perl require 'getopt.pl'; require 'stat.pl'; %days = ( 'Sun' => 1, 'Mon' => 2, 'Tue' => 3, 'Wed' => 4, 'Thu' => 5, 'Fri' => 6, 'Sat' => 7, ); dump QUICKSTART if $ARGV[0] eq '-d'; QUICKSTART: Getopt('f');
local
よりも my
を使うべきでしょう。速く、安全だ
からです。しかし、format
文の変数には、local
やローカルな
値が呼び出されたサブルーティンから見えるような変数を使わなければなりませ
ん。これは、動的スコープと呼ばれます。文面上の静的なスコープは、
my
を使って得られ、C の AUTO 宣言と同じように働きます。
local
はリストアップされた変数を、囲っているブロックやサブルーティ
ン、eval
や do
の中で、ローカルなものにします。複数の値を
並べる場合には、括弧で括る必要があります。並べる要素は、左辺値として使用
できるものでなければなりません。この演算子は LIST 中の、それらの変数の現
在の値を隠れたスタックに保存し、ブロックやサブルーティンや eval から抜け
るときに、それらの値を戻します。これによって、呼ばれたサブルーティンはグ
ローバルな変数ではなく、ローカルな変数を参照することができます。
expr に代入を行なうことも可能で、ローカルな変数の初期化として使う
ことができます。(初期化子を与えなかった変数の値は、未定義値となります。)
これはよく、サブルーティンの引数に名前を付けるのに使われます。例:
sub RANGEVAL { local($min, $max, $thunk) = @_; local $result = ''; local $i; # $thunk が $i へのリファレンスを作るとでしょう for ($i = $min; $i < $max; $i++) { $result .= eval $thunk; } $result; } if ($sw eq '-v') { # ローカル配列をグローバル配列で初期化 local @ARGV = @ARGV; unshift(@ARGV,'echo'); system @ARGV; } # @ARGV が戻される # 一時的に連想配列 digits に加算 if ($base12) { # (NOTE: これにこだわらない方が効率的 !) local(%digits) = (%digits,'t',10,'e',11); parse_num(); }
local()
は実行時のコマンドですから、ループを通るごとに実行される
ことに注意してください。Perl 4 では、ループを抜けるまで、それぞれスタッ
クメモリを使いました。Perl 5 はそれぞれスペースを取り戻しますが、変数を
ループの外で宣言した方が効率的なのは、変わりありません。
expr に代入を行なうとき、local は expr がスカラとして参照さ れるか、配列として参照されるかには、影響しません。つまり、
local($foo) = <STDIN>; local @FOO = <STDIN>;
は、どちらも右辺にリストコンテキストをもたらしますが、
local $foo = <STDIN>;
では、スカラコンテキストになります。
my
はリストアップされた変数を、囲っているブロックやサブルーティン、
eval
や do
の中で (文面上の意味で)ローカルなものにします。
複数の値を並べる場合には、括弧で括る必要があります。並べる要素は、左辺値
として使用できるものでなければなりません。英数字の識別子だけが、文面上の
字句スコープに入れることができます。$/ のような、マジカルな組み込み変数
をローカル化するには、local
を使う必要があります。特に、
my $_; # 不正
とはできません。
local
の宣言とは違って、my
で宣言した変数は、呼び出したサ
ブルーティンを含む、外界からは完全に見えないものになります (たとえ、それ
が同一のサブルーティンであってもです。呼出ごとに新しいものになります)。
(しかし、eval()
を使えば、その eval()
自身の中で宣言によっ
て、名前が見えないようになっているのでない限り、評価が行なわれる字句スコー
プの変数を見ることができます。)See section リファレンスとデータ構造のネスト,を
参照してください。
expr に代入を行なうことも可能で、変数の初期化に使うことができます。 (初期化子を与えなかった変数の値は、未定義値となります。)これはよく、サブ ルーティンの引数に名前を付けるのに使われます。例:
sub RANGEVAL { my($min, $max, $thunk) = @_; my $result = ''; my $i; # $thunk が $i へのリファレンスを作るとでしょう for ($i = $min; $i < $max; $i++) { $result .= eval $thunk; } $result; } if ($sw eq '-v') { # my 配列をグローバル配列で初期化 my @ARGV = @ARGV; unshift(@ARGV,'echo'); system @ARGV; } # 外部の @ARGV が再び見えるようになる
expr に代入を行なうとき、my
は expr がスカラとして参
照されるか、配列として参照されるかには、影響しません。つまり、
my($foo) = <STDIN>; my @FOO = <STDIN>;
は、どちらも右辺にリストコンテキストをもたらしますが、
my $foo = <STDIN>;
では、スカラコンテキストになります。
なるべく、字句スコープの変数を使うようにすることもあるでしょう。暗黙のう ちに、パッケージ変数を参照してしまうのを検出するために、
use strict 'vars';
とすれば、その場所から囲っているブロックの最後までは、字句変数か、パッケー
ジ名で完全に修飾した変数でなければ、参照できないように制限できます。それ
以外の変数参照は、コンパイルエラーとなります。内側のブロックで、
no strict 'vars'
として、これを打ち消すことができます。
があります。参照されるオブジェクトが、何らかのパッケージに bless
されたものであれば、これらの代わりに、そのパッケージ名が返されます。
ref()
は、typeof()
演算子のように考えることができます。
if (ref($r) eq "HASH") { print "r is a reference to an associative array.\n"; } if (!ref ($r) { print "r is not a reference at all.\n"; }
See section リファレンスとデータ構造のネスト,も参照してください。
undef()
しても、おそらく期待通りの結果にはなりませんから、しない
でください。)常に未定義値を返します。expr は省略することができ、そ
の場合には、何も未定義にされませんが、未定義値は返されますので、それを、
たとえば、サブルーティンの返却値として使うことができます。例:
undef $foo; undef $bar{'blurfl'}; undef @ary; undef %assoc; undef &mysub; return (wantarray ? () : undef) if $they_blew_it;
return wantarray ? () : undef;
Go to the first, previous, next, last section, table of contents.