Go to the first, previous, next, last section, table of contents.


その他の関数

Function: defined expr
左辺値 expr が実際に値を持つか否かを示す、ブール値を返します。多く の演算子が、eof や未初期化変数、システムエラーといった、例外的な条 件で未定義値を返すようになっています。この関数は、配列の要素の参照のよう に、実際にヌル文字列を返す演算について、未定義のヌルスカラと、定義済みの ヌルスカラを区別するときに使います。配列やサブルーティンの存在を、確かめ ることもできます。あらかじめ定義された予約変数に対して用いても、直感的に 想像できるような値を返すことは保証されていません。

ハッシュの要素に対して用いると、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() も参照してください。

Function: dump label
即座にコアダンプを行ないます。プログラムの先頭で、すべての変数を初期化し たあとのコアダンプを 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');

Function: local expr
一般には、local よりも my を使うべきでしょう。速く、安全だ からです。しかし、format 文の変数には、local やローカルな 値が呼び出されたサブルーティンから見えるような変数を使わなければなりませ ん。これは、動的スコープと呼ばれます。文面上の静的なスコープは、 my を使って得られ、C の AUTO 宣言と同じように働きます。

local はリストアップされた変数を、囲っているブロックやサブルーティ ン、evaldo の中で、ローカルなものにします。複数の値を 並べる場合には、括弧で括る必要があります。並べる要素は、左辺値として使用 できるものでなければなりません。この演算子は 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>;

では、スカラコンテキストになります。

Function: my expr
my はリストアップされた変数を、囲っているブロックやサブルーティン、 evaldo の中で (文面上の意味で)ローカルなものにします。 複数の値を並べる場合には、括弧で括る必要があります。並べる要素は、左辺値 として使用できるものでなければなりません。英数字の識別子だけが、文面上の 字句スコープに入れることができます。$/ のような、マジカルな組み込み変数 をローカル化するには、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 に代入を行なうとき、myexpr がスカラとして参 照されるか、配列として参照されるかには、影響しません。つまり、

my($foo) = <STDIN>;
my @FOO = <STDIN>;

は、どちらも右辺にリストコンテキストをもたらしますが、

my $foo = <STDIN>;

では、スカラコンテキストになります。

なるべく、字句スコープの変数を使うようにすることもあるでしょう。暗黙のう ちに、パッケージ変数を参照してしまうのを検出するために、

use strict 'vars';

とすれば、その場所から囲っているブロックの最後までは、字句変数か、パッケー ジ名で完全に修飾した変数でなければ、参照できないように制限できます。それ 以外の変数参照は、コンパイルエラーとなります。内側のブロックで、 no strict 'vars' として、これを打ち消すことができます。

Function: ref expr
expr がリファレンスであれば、真を返し、さもなくば、偽を返します。 返される値は、リファレンスが参照するものの型に依存します。組み込みの型に は、

があります。参照されるオブジェクトが、何らかのパッケージに 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 リファレンスとデータ構造のネスト,も参照してください。

Function: undef expr
Function: undef
左辺値である expr の値を未定義にします。スカラ値、配列全体、("&" を使った) サブルーティン名だけに使用します。(特殊変数や DBM リスト値に undef() しても、おそらく期待通りの結果にはなりませんから、しない でください。)常に未定義値を返します。expr は省略することができ、そ の場合には、何も未定義にされませんが、未定義値は返されますので、それを、 たとえば、サブルーティンの返却値として使うことができます。例:
undef $foo;
undef $bar{'blurfl'};
undef @ary;
undef %assoc;
undef &mysub;
return (wantarray ? () : undef) if $they_blew_it;

Function: wantarray
現在実行中のサブルーティンがのコンテキストが、リスト値を要求するものであ れば、「真」を返します。スカラを要求するコンテキストであれば、「偽」を返 します。
return wantarray ? () : undef;


Go to the first, previous, next, last section, table of contents.

検索式: