ハッシュの要素に対して用いると、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.