NAME

perlfunc - Perl 組み込み関数


DESCRIPTION

この節の関数は、式の中で項として使うことができます。 これらは、大きく 2 つに分けられます: リスト演算子と名前付き単項演算子です。 これらの違いは、その後に出て来るコンマとの優先順位の関係にあります。  (perlop の優先順位の表を参照してください。) リスト演算子は 2 個以上の引数をとるのに対して、 単項演算子が複数の引数をとることはありません。 つまり、コンマは単項演算子の引数の終わりとなりますが、 リスト演算子の場合には、引数の区切りでしかありません。 単項演算子は一般に、 引数に対してスカラコンテキストを与えるのに対して、 スカラ演算子の場合には、引数に対してスカラコンテキストを与える場合も、 リストコンテキストを与える場合もあります。 1 つのリスト演算子が 両方のコンテキストを与える場合には、スカラ引数がいくつか並び、 最後にリスト引数が 1 つ続きます。 (リスト引数は 1 つだけです。) たとえば、splice() は 3 つのスカラ引数に 1 つのリスト引数が続きます。 一方 gethostbyname() は 4 つのスカラ引数を持ちます。

後に載せる構文記述では、リストをとり (そのリストの要素にリストコンテキストを与える) リスト演算子は、引数として LIST をとるように書いています。 そのようなリストには、任意のスカラ引数の組み合わせやリスト値を 含めることができ、リスト値はリストの中に、 個々の要素が展開されたように埋め込まれます。 1 次元の長いリスト値が形成されることになります。 LIST の要素は、コンマで区切られます。

以下のリストの関数はすべて、引数の前後の括弧は省略可能と なっています。 (構文記述では省略しています。) 括弧を使うときには、 単純な (しかし、ときには驚く結果となる) 規則が適用できます: 関数に見えるならば、それは関数で、優先順位は関係ありません。 そう見えなければ、それはリスト演算子か単項演算子で、優先順位が 関係します。 また、関数と開き括弧の間の空白は関係ありませんので、 ときに気を付けなければなりません:

    print 1+2+4;        # Prints 7.
    print(1+2) + 4;     # Prints 3.
    print (1+2)+4;      # Also prints 3!
    print +(1+2)+4;     # Prints 7.
    print ((1+2)+4);    # Prints 7.

Perl に -w スイッチを付けて実行すれば、こういったものには 警告を出してくれます。 たとえば、上記の 3 つめは、以下のような警告が出ます:

    print (...) interpreted as function at - line 1.
    Useless use of integer addition in void context at - line 1.

いくつかの関数は引数を全くとらないので、単項演算子としても リスト演算子としても動作しません。 このような関数としては timeendpwent があります。 例えば、time+86_400 は常に time() + 86_400 として扱われます。

スカラコンテキストでも、リストコンテキストでも使える関数は、 致命的でないエラーを示すために、スカラコンテキストでは 未定義値を返し、リストコンテキストでは空リストを返します。

以下に述べる重要なルールを忘れないで下さい: リストコンテキストでの 振る舞いとスカラコンテキストでの振る舞いの関係、あるいはその逆に ルールはありません。 2 つの全く異なったことがあります。 それぞれの演算子と関数は、スカラコンテキストでは、もっとも適切と 思われる値を返します。 リストコンテキストで返す時のリストの長さを返す演算子もあります。 リストの最初の値を返す演算子もあります。 リストの最後の値を返す演算子もあります。 成功した操作の数を返す演算子もあります。 一般的には、一貫性を求めない限り、こちらが求めることをします。

スカラコンテキストでの名前付き配列は、スカラコンテキストでのリストを 一目見たものとは全く違います。 コンパイラはコンパイル時にコンテキストを知っているので、 (1,2,3) のようなリストをスカラコンテキストで得ることはできません。 これはスカラコンマ演算子を生成し、コンマのリスト作成版ではありません。 これは初めからリストであることはないことを意味します。

一般的に、同じ名前のシステムコールのラッパーとして動作する Perl の関数 (chown(2), fork(2), closedir(2) など)は、以下に述べるように、 成功時に真を返し、そうでなければ undef を返します。 これは失敗時に -1 を返す C のインターフェースとは違います。 このルールの例外は wait, waitpid, syscall です。 システムコールは失敗時に特殊変数 $! をセットします。 その他の関数は、事故を除いて、セットしません。

カテゴリ別の Perl 関数

以下に、カテゴリ別の関数(キーワードや名前付き演算子のような、 関数のように見えるものも含みます)を示します。 複数の場所に現れる関数もあります。

Functions for SCALARs or strings

(スカラや文字列のための関数)

chomp, chop, chr, crypt, hex, index, lc, lcfirst, length, oct, ord, pack, q//, qq//, reverse, rindex, sprintf, substr, tr///, uc, ucfirst, y///

Regular expressions and pattern matching

(正規表現とパターンマッチング)

m//, pos, quotemeta, s///, split, study, qr//

Numeric functions

(数値関数)

abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt, srand

Functions for real @ARRAYs

(実配列のための関数)

pop, push, shift, splice, unshift

Functions for list data

(リストデータのための関数)

grep, join, map, qw//, reverse, sort, unpack

Functions for real %HASHes

(実ハッシュのための関数)

delete, each, exists, keys, values

Input and output functions

(入出力関数)

binmode, close, closedir, dbmclose, dbmopen, die, eof, fileno, flock, format, getc, print, printf, read, readdir, rewinddir, say, seek, seekdir, select, syscall, sysread, sysseek, syswrite, tell, telldir, truncate, warn, write

Functions for fixed length data or records

(固定長データやレコードのための関数)

pack, read, syscall, sysread, syswrite, unpack, vec

Functions for filehandles, files, or directories

(ファイルハンドル、ファイル、ディレクトリのための関数)

-X, chdir, chmod, chown, chroot, fcntl, glob, ioctl, link, lstat, mkdir, open, opendir, readlink, rename, rmdir, stat, symlink, sysopen, umask, unlink, utime

Keywords related to the control flow of your Perl program

(プログラムの流れを制御することに関連するキーワード)

caller, continue, die, do, dump, eval, exit, goto, last, next, redo, return, sub, wantarray

Keywords related to switch

(switch に関連するキーワード)

break, continue, given, when, default

(これらは "switch" 機能が有効の場合にのみ利用可能です。 featureSwitch statements in perlsyn を参照してください。)

Keywords related to scoping

(スコープに関するキーワード)

caller, import, local, my, our, state, package, use

(state は "state" 機能が有効の場合にのみ利用可能です。 feature を参照してください。)

Miscellaneous functions

(さまざまな関数)

defined, dump, eval, formline, local, my, our, reset, scalar, state, undef, wantarray

Functions for processes and process groups

(プロセスとプロセスグループのための関数)

alarm, exec, fork, getpgrp, getppid, getpriority, kill, pipe, qx//, setpgrp, setpriority, sleep, system, times, wait, waitpid

Keywords related to perl modules

(perl モジュールに関するキーワード)

do, import, no, package, require, use

Keywords related to classes and object-orientation

(クラスとオブジェクト指向に関するキーワード)

bless, dbmclose, dbmopen, package, ref, tie, tied, untie, use

Low-level socket functions

(低レベルソケット関数)

accept, bind, connect, getpeername, getsockname, getsockopt, listen, recv, send, setsockopt, shutdown, socket, socketpair

System V interprocess communication functions

(System V プロセス間通信関数)

msgctl, msgget, msgrcv, msgsnd, semctl, semget, semop, shmctl, shmget, shmread, shmwrite

Fetching user and group info

(ユーザーとグループの情報取得)

endgrent, endhostent, endnetent, endpwent, getgrent, getgrgid, getgrnam, getlogin, getpwent, getpwnam, getpwuid, setgrent, setpwent

Fetching network info

(ネットワーク情報取得)

endprotoent, endservent, gethostbyaddr, gethostbyname, gethostent, getnetbyaddr, getnetbyname, getnetent, getprotobyname, getprotobynumber, getprotoent, getservbyname, getservbyport, getservent, sethostent, setnetent, setprotoent, setservent

Time-related functions

(時刻に関する関数)

gmtime, localtime, time, times

Functions new in perl5

(perl5 で新設された関数)

abs, bless, break, chomp, chr, continue, default, exists, formline, given, glob, import, lc, lcfirst, lock, map, my, no, our, prototype, qr//, qw//, qx//, readline, readpipe, ref, sub*, sysopen, tie, tied, uc, ucfirst, untie, use, when

* - sub は perl4 ではキーワードですが、perl5 では演算子なので、 式で使えます。

Functions obsoleted in perl5

(perl5 では古いものとなった関数)

dbmclose, dbmopen

移植性

Perl は Unix 環境で生まれたので、全ての共通する Unix システムコールに アクセスします。非 Unix 環境では、いくつかの Unix システムコールの 機能が使えなかったり、使える機能の詳細が多少異なったりします。 これによる影響を受ける Perl 関数は以下のものです:

-X, binmode, chmod, chown, chroot, crypt, dbmclose, dbmopen, dump, endgrent, endhostent, endnetent, endprotoent, endpwent, endservent, exec, fcntl, flock, fork, getgrent, getgrgid, gethostbyname, gethostent, getlogin, getnetbyaddr, getnetbyname, getnetent, getppid, getpgrp, getpriority, getprotobynumber, getprotoent, getpwent, getpwnam, getpwuid, getservbyport, getservent, getsockopt, glob, ioctl, kill, link, lstat, msgctl, msgget, msgrcv, msgsnd, open, pipe, readlink, rename, select, semctl, semget, semop, setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent, setsockopt, shmctl, shmget, shmread, shmwrite, socket, socketpair, stat, symlink, syscall, sysopen, system, times, truncate, umask, unlink, utime, wait, waitpid

これらの関数の移植性に関するさらなる情報については、 perlport とその他のプラットホーム固有のドキュメントを参照して下さい。

Alphabetical Listing of Perl Functions

-X FILEHANDLE
-X EXPR
-X DIRHANDLE
-X

X は以下にあげる文字で、ファイルテストを行ないます。 この単項演算子は、ファイル名かファイルハンドルを唯一の 引数として動作し、「あること」について真であるか否かを 判定した結果を返します。 引数が省略されると、-t では STDIN を調べますが、その他は $_ を調べます。 特に記述されていなければ、真として 1 を返し、偽として '' を返し、ファイルが存在しなければ、未定義値を返します。 みかけは変わっていますが、優先順位は名前付き単項演算子と同じで、 他の単項演算子と同じく、引数を括弧で括ることもできます。 演算子には以下のものがあります:

    -r  ファイルが実効 uid/gid で読み出し可
    -w  ファイルが実効 uid/gid で書き込み可
    -x  ファイルが実効 uid/gid で実行可
    -o  ファイルが実効 uid の所有物
    -R  ファイルが実 uid/gid で読み出し可
    -W  ファイルが実 uid/gid で書き込み可
    -X  ファイルが実 uid/gid で実行可
    -O  ファイルが実 uid の所有物
    -e  ファイルが存在する
    -z  ファイルの大きさがゼロ(空)
    -s  ファイルの大きさがゼロ以外 (バイト単位での大きさを返す)
    -f  ファイルは通常ファイル
    -d  ファイルはディレクトリ
    -l  ファイルはシンボリックリンク
    -p  ファイルは名前付きパイプ (FIFO) またはファイルハンドルはパイプ
    -S  ファイルはソケット
    -b  ファイルはブロック特殊ファイル
    -c  ファイルはキャラクタ特殊ファイル
    -t  ファイルハンドルは tty にオープンされている
    -u  ファイルの setuid ビットがセットされている
    -g  ファイルの setgid ビットがセットされている
    -k  ファイルの sticky ビットがセットされている
    -T  ファイルは ASCII テキストファイル (発見的に推測します)
    -B  ファイルは「バイナリ」ファイル (-T の反対)
    -M  スクリプト実行開始時刻からファイル修正時刻を引いたもの(日単位)
    -A  同様にアクセスがあってからの日数
    -C  同様に(Unix では) inode が変更されてからの日数(それ以外のプラットフォームでは違うかもしれません)

例:

    while (<>) {
        chomp;
        next unless -f $_;      # ignore specials
        #...
    }

ファイルのパーミッション演算子 -r, -R, -w, -W, -x, -X の解釈は、ファイルのモードとユーザの実効/実 uid と 実効/実 gid のみから判断されます。 実際にファイルが読めたり、書けたり、実行できたりするためには、 別の条件が必要かもしれません: 例えば、ネットワークファイルシステムアクセスコントロール、 ACL(アクセスコントロールリスト)、読み込み専用ファイルシステム、 認識できない実行ファイルフォーマット、などです。 これらの 6 つの演算子を、特定の操作が可能かどうかを確認するために使うのは 通常は誤りであることに注意してください; なぜなら、これらは競合条件を 招きやすいからです。

ローカルファイルシステムのスーパーユーザには、 -r, -R, -w, -W に対して、常に 1 が返り、モード中の いずれかの実行許可ビットが立っていれば、-x, -X にも 1 が 返ることにも注意してください。 スーパーユーザが実行するスクリプトでは、ファイルのモードを調べるためには、 stat() を行なうか、実効 uid を一時的に別のものにする 必要があるでしょう。

ACL を使っている場合は、生の stat() モードビットより 精度の高い結果を作成する filetest プラグマがあります。 use filetest 'access' とした場合、上述したファイルテストは システムコールの access() ファミリーを使って権限が与えられているか どうかをテストします。 また、このプラグマが指定されている場合、-x-X は たとえ実行許可ビット(または追加の実行許可 ACL)がセットされていない 場合でも真を返すことに注意してください。 この挙動は使用するシステムコールの定義によるものです。 use filetest 'access' の実装により、このプラグマが有効の場合は _ 特殊ファイルハンドルはファイルテストの結果をキャッシュしないことに 注意してください。 さらなる情報については filetest プラグマのドキュメントを 参照してください。

-s/a/b は、置換演算 (s///) の符号反転ではありません。 しかし、-exp($foo) は期待どおりに動作します。 マイナス記号の後に英字が 1 字続くときにのみ、ファイルテストと 解釈されます。

ファイルテスト -T-B の動作原理は、次のようになっています。 ファイルの最初の数ブロックを調べて、変わった制御コードや 上位ビットがセットされているような、通常のテキストには現れない文字を探します。 そのような文字が、たくさん (>30%) 見つかるようであれば、 そのファイルは -B ファイルであると判断されます; さもなければ -T ファイルとなります。 最初のブロックにヌル文字が含まれるファイルも、 バイナリファイルとみなされます。 -T-B をファイルハンドルに対して用いると、 最初のブロックを調べる代わりに、IO バッファを調べます。 調べたファイルの中身が何もないときや、 ファイルハンドルを調べたときに EOF に達して いたときには、-T-B も「真」を返します。 -T テストをするためにはファイルを読み込まないといけないので、 たいていは next unless -f $file && -T $file というような形で まず調べたいファイルに対して -f を使いたいはずです。

どのファイルテスト (あるいは、statlstat) 演算子にも、 下線だけから成る特別なファイルハンドルを与えると、 前回のファイルテスト (や stat) の stat 構造体が使われ、 システムコールを省きます。 (-t には使えませんし、lstat() や -l は実ファイルではなく、 シンボリックリンクの情報を stat 構造体に残すことを 覚えておく必要があります。) (また、stat バッファが lstat 呼び出しで埋まった場合、 -T-B の結果は stat _ の結果でリセットされます。 例:

    print "Can do.\n" if -r $a || -w _ || -x _;
    stat($filename);
    print "Readable\n" if -r _;
    print "Writable\n" if -w _;
    print "Executable\n" if -x _;
    print "Setuid\n" if -u _;
    print "Setgid\n" if -g _;
    print "Sticky\n" if -k _;
    print "Text\n" if -T _;
    print "Binary\n" if -B _;

Perl 5.9.1 から、純粋にシンタックスシュガーとして、ファイルテスト演算子を スタックさせることができるので、-f -w -x $file-x $file && -w _ && -f _ と等価です。 (これば文法上だけの話です; もし -f $file の返り値を他のファイルテスト 演算子の引数として使う場合は、何の特別なことも起きません。)

abs VALUE
abs

引数の絶対値を返します。 VALUE が省略された場合は、$_ を使います。

accept NEWSOCKET,GENERICSOCKET

accept(2) システムコールと同様に、着信するソケットの接続を受け付けます。 成功時にはパックされたアドレスを返し、失敗すれば偽を返します。 Sockets: Client/Server Communication in perlipc の 例を参照してください。

ファイルに対する close-on-exec フラグをサポートしているシステムでは、 フラグは $^F の値で決定される、新しくオープンされたファイル記述子に対して セットされます。$^F in perlvar を参照してください。

alarm SECONDS
alarm

指定した壁時計秒数が経過した後に、自プロセスに SIGALRM が 送られてくるようにします。SECONDS が指定されていない場合は、 $_に格納されている値を使います。 (マシンによっては、秒の数え方が異なるため、指定した秒数よりも 最大で 1 秒ずれます。)

一度には 1 つのタイマだけが設定可能です。 呼び出しを行なう度に、以前のタイマを無効にしますし、 新しくタイマを起動しないで以前のタイマをキャンセルするために 引数に 0 を指定して呼び出すことができます。 以前のタイマの残り時間が、返り値となります。

1 秒より精度の高いスリープを行なうには、 Time::HiRes モジュール(CPAN から、また Perl 5.8 からは 標準配布されています) が ualarm() を提供します。 Perl の 4 引数版 select() を最初の 3 引数を未定義にして使うか、 setitimer(2) をサポートしているシステムでは、Perl の syscall インタフェースを使ってアクセスすることもできます。 詳しくは perlfaq8 を参照してください。

alarmsleep を混ぜて使うのは普通は間違いです。 (sleep は内部的に alarm を使って内部的に実装されているかもしれません)

alarm をシステムコールの時間切れのために使いたいなら、 eval/die のペアで使う必要があります。 システムコールが失敗したときに $!EINTR がセットされることに 頼ってはいけません。なぜならシステムによっては Perl は システムコールを再開するためにシグナルハンドラを設定するからです。 eval/die は常にうまく動きます。 注意点については Signals in perlipc を参照して下さい。

    eval {
        local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
        alarm $timeout;
        $nread = sysread SOCKET, $buffer, $size;
        alarm 0;
    };
    if ($@) {
        die unless $@ eq "alarm\n";   # propagate unexpected errors
        # timed out
    }
    else {
        # didn't
    }

さらなる情報については perlipc を参照してください。

atan2 Y,X

-πからπの範囲で Y/X の逆正接を返します。

正接を求めたいときは、Math::Trig::tan を使うか、 以下のよく知られた関係を使ってください。

    sub tan { sin($_[0]) / cos($_[0])  }

atan2(0, 0) は未定義であることに注意してください。

bind SOCKET,NAME

bind(2) システムコールと同様に、ネットワークアドレスをソケットに結び付けます。 成功時には真を返し、失敗時には偽を返します。 NAME は、ソケットに対する、適切な型のパックされたアドレスでなければなりません。 Sockets: Client/Server Communication in perlipc の例を参照してください。

binmode FILEHANDLE, LAYER
binmode FILEHANDLE

バイナリファイルとテキストファイルを区別する OS において、 FILEHANDLE を「バイナリ」または「テキスト」で読み書きするように 指定します。 FILEHANDLE が式である場合には、その式の値がファイルハンドルの 名前として使われます。

テキストファイルでないものを扱う場合に binmode() が必要な システムもあります(一般的には DOS と Windows ベースのシステムです)。 移植性のために、適切なときには常にこれを使い、適切でないときには 決して使わないというのは良い考えです。 また、デフォルトとして I/O を bytes ではなく UTF-8 エンコードされた Unicode にセットすることも出来ます。

言い換えると: プラットフォームに関わらず、 例のイメージのようなバイナリファイルに対しては binmode() を使ってください。

LAYER が存在すると、それは単一の文字列ですが、複数の指示子を 含むことができます。 指示子はファイルハンドルの振る舞いを変更します。 LAYER が存在すると、テキストファイルでの binmode が意味を持ちます。

LAYER が省略されたり、:raw が指定されると、ファイルハンドルはバイナリ データの通過に適するように設定されます。 これには CRLF 変換をオフにしたり、それぞれを(Unicode 文字ではなく) バイトであるとマークしたりすることを含みます。 "プログラミング Perl"(ラクダ本) やその他で暗示されているにも関わらず、 :raw は単なる :crlf逆ではありません -- ストリームの バイナリとしての性質に影響を与える その他の層も無効にされますPerlIO, perlrun およびPERLIO 環境変数に関する議論を参照してください。

:bytes, :crlf, and :utf8, 及びその他の :... 形式の指示子は I/O が呼び出されます。 open プラグマはデフォルト I/O 層を指定するために使われます。 open を参照してください。

binmode() 関数の LAYER パラメータは 「プログラミングPerl 第3版」では 「ディシプリン(DISCIPLINE)」と表現されていました。 しかし、「ラクダ本第3版」として知られているこの本の出版後、この機能の名前は 「ディシプリン」から「層」に変更することで合意されました。 従って、このバージョンの Perl の全ての文書では「ディシプリン」ではなく 「層」と記述されています。では通常の解説に戻ります…。

FILEHANDLE が UTF-8 であるというマークをつけるには、:utf8:encoding(utf8) を使ってください。 :utf8 は、さらなるチェックなしにデータが UTF-8 としてマークしますが、 :encoding(utf8) はデータが実際に有効な UTF-8 かどうかをチェックします。 さらなる詳細は PerlIO::encoding にあります。

一般的に binmode()open() を呼び出した後、このファイルハンドルに対する I/O 操作をする前に呼び出すべきです。 binmode() を呼び出すと、普通はこのファイルハンドルに対して バッファリングされている全ての出力データ (およびおそらくは入力データ)をフラッシュします。 例外は、このハンドルに対するデフォルト文字エンコーディングを変更する :encoding 層です; open を参照してください。 :encoding 層はストリームの途中で呼び出す必要があることがあり、 それによってストリームはフラッシュされません。 Perl は内部で UTF-8 エンコードされた Unicode 文字を操作しているので、 :encoding は暗黙のうちに自身を :utf8 層の上に押し上げます。

オペレーションシステム、デバイスドライバ、C ライブラリ、 Perl ランタイムシステムは全て、プログラマが外部表現に関わらず 1 文字 (\n) を行終端として扱えるように協調作業します。 多くのオペレーティングシステムでは、ネイティブテキストファイル表現は 内部表現と同じですが、\n の外部表現が複数文字になる プラットフォームもあります。

Mac OS、全ての Unix 系、VMS の Stream_LF ファイルは テキストの外部表現として各行の末尾に 1 つの文字を 使っています(その文字は Mac OS では復帰で、 Unix とほとんどのVMS のファイルでは改行です)。 VMS, MS-DOS, MS-Windows 系といったその他のシステムでは、 プログラムからは \n は単純に \cJ に見えますが、 テキストファイルとして保存される場合は \cM\cJ の 2 文字になります。 つまり、もしこれらのシステムで binmode() を使わないと、 ディスク上の \cM\cJ という並びは入力時に \n に変換され、 プログラムが出力した全ての \n\cM\cJ に逆変換されます。 これはテキストファイルの場合は思い通りの結果でしょうが、 バイナリファイルの場合は悲惨です。

binmode() を(いくつかのシステムで)使うことによるその他の作用としては、 特別なファイル終端マーカーがデータストリームの一部として 見られることです。 Microsoft ファミリーのシステムでは、binmode() を使っていないと もしバイナリデータに \cZ が含まれていたときに、I/O サブシステムが これをファイル終端とみなすことを意味します。

binmode()readline()print() 操作にだけではなく、 read(), seek(), sysread(), syswrite(), tell() を使うときにも重要です (詳細は perlport を参照してください)。 入出力の行端末シーケンスを手動でセットする方法については perlvar$/ 変数と $\ 変数を参照してください。

bless REF,CLASSNAME
bless REF

この関数は、REF で渡された オブジェクトに対し、 CLASSNAME 内のオブジェクトとなったことを伝えます。 CLASSNAME が省略された場合には、その時点のパッケージとなります。 bless は通常、コンストラクタの最後に置かれますので、 簡便のためにそのリファレンスを返します。 派生クラスが bless される関数を継承する場合は、 常に 2 引数版を使ってください。 オブジェクトの bless (や再 bless) について、 詳しくは perltootperlobj を参照してください。

大文字小文字が混じっている CLASSNAME のオブジェクトは常に bless することを 考慮してください。 全て小文字の名前を持つ名前空間は Perl プラグマのために予約されています。 組み込みの型は全て大文字の名前を持ちます。 混乱を避けるために、 パッケージ名としてこのような名前は避けるべきです。 CLASSNAME は真の値を持つようにしてください。

Perl Modules in perlmod を参照して下さい。

break

given() ブロックから脱出します。

このキーワードは "switch" 機能によって有効になります: さらなる情報については feature を参照してください。

caller EXPR
caller

その時点のサブルーチン呼び出しのコンテキストを返します。 スカラコンテキストでは、呼び元がある場合 (サブルーチン、evalrequire の中にいるとき) には 呼び出し元のパッケージ名を返し、その他のときには未定義値を返します。 リストコンテキストでは、以下を返します:

    # 0         1          2
    ($package, $filename, $line) = caller;

EXPR を付けると、デバッガがスタックトレースを表示するために使う情報を返します。 EXPR の値は、現状から数えて、 いくつ前のコールフレームまで戻るかを示します。

    #  0         1          2      3            4
    ($package, $filename, $line, $subroutine, $hasargs,
    #  5          6          7            8       9         10
    $wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash)
     = caller($i);

ここでフレームがサブルーチン呼び出しでない場合、eval ではなく (eval) になります。 この場合、追加の要素である $evaltext と $is_require がセットされます: $is_require はフレームが require または use で作られた場合に 真になり、$evaltext は eval EXPR のテキストが入ります。 特に、eval BLOCK の場合、$subroutine は (eval) になりますが、 $evaltext は未定義値になります。 (それぞれの useeval EXPR の中で require フレームを作ることに 注意してください。) $subroutine は、そのサブルーチンがシンボルテーブルから削除された場合は (unknown) になります。 $hasargs はこのフレーム用に @_ の新しい実体が設定された場合に真となります。 $hints$bitmask は caller がコンパイルされたときの 実際的なヒントを含みます。 $hints$bitmask は Perl のバージョンによって変更される 可能性があるので、外部での使用を想定していません。

$hinthash は、caller がコンパイルされた時の %^H の値を含む ハッシュへのリファレンスか、あるいは %^H が空の場合は undef です。 このハッシュの値は構文木に保管されている実際の値なので、変更しないで下さい。

さらに、DB パッケージの中から呼ばれた場合は、caller は より詳細な情報を返します。 サブルーチンが起動されたときの引数を変数 @DB::args に設定します。

caller が情報を得る前にオプティマイザが呼び出しフレームを最適化して しまうかもしれないことに注意してください。 これは、caller(N)N > 1 のとき、 あなたが予測した呼び出しフレームの情報を返さないかもしれないことを意味します。 特に、@DB::argscaller が前回呼び出された時の情報を 持っているかもしれません。

chdir EXPR
chdir FILEHANDLE
chdir DIRHANDLE
chdir

(可能であれば、) カレントディレクトリを EXPR に移します。 EXPR を指定しないと、$ENV{HOME} が設定されていれば、 そのディレクトリに移ります。 そうでなく、$ENV{LOGDIR}が設定されていれば、そのディレクトリに移ります。 (VMS では $ENV{SYS$LOGIN} もチェックされ、もしセットされていれば使われます。) どちらも設定されていなければ、chdir は何もしません。 成功時には真を返し、そうでなければ偽を返します。 die の項の例を参照してください。

fchdir に対応しているシステムでは、ファイルハンドルやディレクトリハンドルを 引数として渡せます。 fchdir に対応していないシステムでは、ハンドルを渡すと実行時に 致命的エラーになります。

chmod LIST

LIST に含まれるファイルの、パーミッションを変更します。 LIST の最初の要素は、数値表現のモードでなければなりません。 0644 は OK ですが、 '0644' はだめです。 変更に成功したファイルの数を返します。 文字列を使いたい場合は、oct を参照してください。

    $cnt = chmod 0755, 'foo', 'bar';
    chmod 0755, @executables;
    $mode = '0644'; chmod $mode, 'foo';      # !!! sets mode to
                                             # --w----r-T
    $mode = '0644'; chmod oct($mode), 'foo'; # this is better
    $mode = 0644;   chmod $mode, 'foo';      # this is best

fchmod に対応しているシステムでは、ファイルハンドルを引数として渡せます。 fchmod に対応していないシステムでは、ファイルハンドルを渡すと実行時に 致命的エラーになります。 ファイルハンドルを認識させるためには、グロブまたはリファレンスとして 渡されなければなりません。 裸の単語はファイル名として扱われます。

    open(my $fh, "<", "foo");
    my $perm = (stat $fh)[2] & 07777;
    chmod($perm | 0600, $fh);

シンボリックな S_I* 定数を Fcntl モジュールからインポートすることもできます。

    use Fcntl ':mode';
    chmod S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, @executables;
    # This is identical to the chmod 0755 of the above example.
chomp VARIABLE
chomp( LIST )
chomp

より安全な chop (以下を参照してください) です。 $/ (English モジュールでは、$INPUT_RECORD_SEPARATOR とも言う) のその時点の値に対応する行末文字を削除します。 全ての引数から削除した文字数の合計を返します。 入力レコードから、改行を削除したいのだけれど、最後のレコードには改行が 入っているのかわからないような場合に、使用できます。 段落モード ($/ = "") では、レコードの最後の改行をすべて取り除きます。 吸い込みモード ($/ = undef) や 固定長レコードモード ($/ が整数へのリファレンスや類似のものの場合。perlvarを参照してください) では、chomp() は何も取り除きません。 VARIABLE が省略されると、$_ を対象として chomp します。 例:

    while (<>) {
        chomp;  # avoid \n on last field
        @array = split(/:/);
        # ...
    }

VARIABLE がハッシュなら、ハッシュのキーではなく値について chomp します。

左辺値であれば、代入を含めて、任意のものを chomp できます:

    chomp($cwd = `pwd`);
    chomp($answer = <STDIN>);

リストを chomp すると、個々の要素が chomp され、 削除された文字数の合計が返されます。

単純な変数以外のものを chomp する場合はかっこが必要であることに 注意してください。 これは、chomp $cwd = `pwd`; は、予測している chomp( $cwd = `pwd` ) ではなく、(chomp $cwd) = `pwd`; と 解釈されるからです。 同様に、chomp $a, $b ではなく、chomp($a, $b) chomp($a), $b と 解釈されます。

chop VARIABLE
chop( LIST )
chop

文字列の最後の文字を切り捨てて、その切り取った文字を返します。 文字列の検索もコピーも行ないませんので s/\n// よりも、ずっと効率的です。 VARIABLE が省略されると、$_ を対象として chop します。 VARIABLE がハッシュの場合、ハッシュの value を chop しますが、 key は chop しません。

実際のところ、代入を含む左辺値となりうるなんでも chop できます。

リストを chop すると、個々の要素が chop されます。 最後の chop の値だけが返されます。

chop は最後の文字を返すことに注意してください。 最後以外の全ての文字を返すためには、substr($string, 0, -1) を 使ってください。

chomp も参照してください。

chown LIST

LIST に含まれるファイルの所有者 (とグループ) を変更します。 LIST の最初の 2 つの要素には、数値表現 の uid と gid を この順序で与えなければなりません。 どちらかの値を -1 にすると、ほとんどのシステムではその値は 変更しないと解釈します。 変更に成功したファイルの数が返されます。

    $cnt = chown $uid, $gid, 'foo', 'bar';
    chown $uid, $gid, @filenames;

fchown に対応しているシステムでは、ファイルハンドルを引数として渡せます。 fchown に対応していないシステムでは、ファイルハンドルを渡すと実行時に 致命的エラーになります。 ファイルハンドルを認識させるためには、グロブまたはリファレンスとして 渡されなければなりません。 裸の単語はファイル名として扱われます。

passwd ファイルから数値表現でない uid を検索する例を 示します:

    print "User: ";
    chomp($user = <STDIN>);
    print "Files: ";
    chomp($pattern = <STDIN>);
    ($login,$pass,$uid,$gid) = getpwnam($user)
        or die "$user not in passwd file";
    @ary = glob($pattern);      # expand filenames
    chown $uid, $gid, @ary;

ほとんどのシステムでは、スーパーユーザーだけがファイルの所有者を 変更できますが、グループは実行者の副グループに変更できるべきです。 安全でないシステムでは、この制限はゆるめられています。 しかしこれは移植性のある仮定ではありません。 POSIX システムでは、以下のようにしてこの条件を検出できます:

    use POSIX qw(sysconf _PC_CHOWN_RESTRICTED);
    $can_chown_giveaway = not sysconf(_PC_CHOWN_RESTRICTED);
chr NUMBER
chr

特定の文字セットでの NUMBER で表わされる文字を返します。 たとえば、chr(65) は ASCII と Unicode の両方で "A" となります。 chr(0x263a) は Unicode のスマイリーフェイスです。

負の数は Unicode の置換文字 (chr(0xfffd)) を与えますが、 bytes プラグマの影響下では、(integer に切り詰められた)値の下位 8 ビットが 使われます。

NUMBER が省略された場合、$_ を使います。

逆を行うためには、ord を参照してください。

128 から 255 までの文字は過去との互換性のために デフォルトでは UTF-8 Unicode にエンコードされません。

Unicode についてもっと知りたいなら、perlunicode を 参照してください。

chroot FILENAME
chroot

同じ名前のシステムコールと同じことをします。 現在のプロセス及び子プロセスに対して、/で始まるパス名に関して 指定されたディレクトリを新しいルートディレクトリとして扱います。 (これはカレントディレクトリを変更しません。カレントディレクトリはそのままです)。 セキュリティ上の理由により、この呼び出しはスーパーユーザーしか行えません。 FILENAME を省略すると、$_chroot します。

close FILEHANDLE
close

FILEHANDLE に対応したファイルまたはパイプをクローズして、 IO バッファをフラッシュし、システムファイル記述子をクローズします。 操作が成功し、PerlIO 層からエラーが報告されなかった場合に真を返します。 引数が省略された場合、現在選択されているファイルハンドルをクローズします。

クローズしてすぐにまた、同じファイルハンドルに 対してオープンを行なう場合には、open が自動的に close を行ないますので、close FILEHANDLE する必要はありません (open を参照してください)。 ただし、明示的にクローズを行なったときにのみ入力ファイルの 行番号 ($.) のリセットが行なわれ、open によって行なわれる 暗黙の closeでは行なわれません。

ファイルハンドルがパイプつきオープンなら、 close はその他のシステムコールが失敗したり プログラムが非ゼロのステータスで終了した場合にも偽を返します (プログラムが非ゼロで終了しただけの場合は、$!0にセットされます)。 後でパイプの出力を見たい場合のために、 パイプのクローズでは、パイプ上で実行されている プロセスの完了を待ちます。 また自動的にコマンドのステータス値を $?${^CHILD_ERROR_NATIVE} に設定します。

途中で(つまり、書き込み側が閉じる前に) パイプの読み込み側が閉じた場合、 書き込み側に SIGPIPE が配送されます。 書き込み側がこれを扱えない場合、パイプを閉じる前に 確実に全てのデータが読み込まれるようにする必要があります。

例:

    open(OUTPUT, '|sort >foo')  # pipe to sort
        or die "Can't start sort: $!";
    #...                        # print stuff to output
    close OUTPUT                # wait for sort to finish
        or warn $! ? "Error closing sort pipe: $!"
                   : "Exit status $? from sort";
    open(INPUT, 'foo')          # get sort's results
        or die "Can't open 'foo' for input: $!";

FILEHANDLE は式でもかまいません。この場合、値は間接ファイルハンドルと して扱われ、普通は実際のファイルハンドル名です。

closedir DIRHANDLE

opendir でオープンしたディレクトリをクローズし、 システムコールの返り値を返します。

connect SOCKET,NAME

connect(2) システムコールと同様に、リモートソケットへの接続を試みます。 成功時には真を返し、失敗時には偽を返します。 NAME は、ソケットに対する、適切な型のパックされた アドレスでなければなりません。 Sockets: Client/Server Communication in perlipc の例を参照してください。

continue BLOCK
continue

continue は実際には関数ではなく、実行制御文です。 continue BLOCK が BLOCK (典型的には while または foreach の中)にあると、 これは条件文が再評価される直前に常に実行されます。 これは C における for ループの 3 番目の部分と同様です。 従って、これは next 文 (これは C の continue 文と似ています)を使ってループが繰り返されるときでも ループ変数を増やしたいときに使えます。

last, next, redocontinue ブロック内に現れる可能性があります。 lastredo はメインブロックの中で実行されたのと同じように振舞います。 next の場合は、continue ブロックを実行することになるので、 より面白いことになります。

    while (EXPR) {
        ### redo always comes here
        do_something;
    } continue {
        ### next always comes here
        do_something_else;
        # then back the top to re-check EXPR
    }
    ### last always comes here

continue 節を省略するのは、文法的には空の節を指定したのと同じで、 論理的には十分です。 この場合、next は直接ループ先頭の条件チェックに戻ります。

"switch" 機能が有効なら、continue は現在の whendefault の ブロックから飛び出して、次の場合に移動するための文となります。 さらなる情報については featureSwitch statements in perlsyn を 参照してください。

cos EXPR
cos

(ラジアンで示した) EXPR の余弦を返します。 EXPR が省略されたときには、$_ の余弦を取ります。

逆余弦を求めるためには、Math::Trig::acos() 関数を使うか、 以下の関係を使ってください。

    sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) }
crypt PLAINTEXT,SALT

C ライブラリの crypt(3) 関数と全く同じように、ダイジェスト文字列を 作成します(一時的な必需品として、まだ絶滅していないバージョンを 持っていると仮定しています)。

crypt() は一方向ハッシュ関数です。 PLAINTEXT と SALT はダイジェストと呼ばれる短い文字列に変えられて、 それが返されます。 PLAINTEXT と SALT が同じ場合は常に同じ文字列を返しますが、ハッシュから 元の PLAINTEXT を得る(既知の)方法はありません。 PLAINTEXT や SALT を少し変更してもダイジェストは大きく変更されます。

複合化関数はありません。 この関数は暗号化のためにはまったく役に立ちません(このためには、 お近くの CPAN ミラーで Crypt モジュールを探してください)ので、 "crypt" という名前は少し間違った名前です。 その代わりに、一般的には二つのテキスト片が同じかどうかをテキストそのものを 転送したり保管したりせずにチェックするために使います。 例としては、正しいパスワードが与えられたかどうかをチェックがあります。 パスワード自身ではなく、パスワードのダイジェストが保管されます。 ユーザーがパスワードを入力すると、保管されているダイジェストと同じ salt で crypt() します。 二つのダイジェストが同じなら、パスワードは正しいです。

すでにあるダイジェスト文字列を検証するには、ダイジェストを (crypt($plain, $digest) eq $digest のようにして)salt として使います。 ダイジェストを作るのに使われた SALT はダイジェストの一部として見えます。 これにより、crypt() は同じ salt で新しい文字列をダイジェストとして ハッシュ化できるようにします。 これによって標準的な crypt|/crypt や、より風変わりな実装でも動作します。 言い換えると、返される文字列そのものや、ダイジェスト文字列が 何バイトあるかといったことに対して、どのような仮定もしてはいけません。

伝統的には結果は 13 バイトの文字列です: 最初の 2 バイトは salt、引き続いて 集合 [./0-9A-Za-z] からの 11 バイトで、ダイジェスト文字列の最初の 8 バイトだけが意味がありますが、(MD5 のように) 異なったハッシュ手法、 (C2 のような) 高レベルセキュリティ手法、非 UNIX プラットフォームでの 実装などでは異なった文字列が生成されることがあります。

新しい salt を選択する場合は、集合 [./0-9A-Za-z] から (join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64] のようにして) ランダムに2 つの文字を選びます。 この文字集合は単なる推薦です; salt として許される文字はシステムの暗号化 ライブラリだけに依存し、Perl は crypt() がどのような salt を受け付けるかに ついて制限しません。

プログラムを実行する人が、 自分のパスワードを知っていることを確認する例です:

    $pwd = (getpwuid($<))[1];
    system "stty -echo";
    print "Password: ";
    chomp($word = <STDIN>);
    print "\n";
    system "stty echo";
    if (crypt($word, $pwd) ne $pwd) {
        die "Sorry...\n";
    } else {
        print "ok\n";
    }

もちろん、自分自身のパスワードを誰にでも入力するのは賢明ではありません。

crypt 関数は大量のデータのハッシュ化には向いていません。 これは情報を戻せないという理由だけではありません。 より頑強なアルゴリズムについては Digest モジュールを参照してください。

Unicode 文字列(潜在的には 255 を越えるコードポイントを持つ文字を 含みます)に crypt() を使った場合、Perl は crypt() を呼び出す前に与えられた 文字列を8 ビットバイト文字列にダウングレードする(文字列のコピーを作る) ことで状況のつじつまを合わせようとします。 うまく動けば、それでよし。動かなければ、crypt() は Wide character in crypt というメッセージと共に die します。

dbmclose HASH

[この関数は、untie 関数に大きくとって代わられました。]

DBM ファイルとハッシュの連結をはずします。

dbmopen HASH,DBNAME,MASK

[この関数は、tie 関数に大きくとって代わられました。]

dbm(3), ndbm(3), sdbm(3), gdbm(3) ファイルまたは Berkeley DB ファイルを連想配列に結び付けます。 HASH は、その連想配列の名前です。 (普通の open とは違って、最初の引数はファイルハンドル ではありません。まあ、似たようなものですが。) DBNAME は、データベースの名前です (拡張子の .dir や .pag はもしあってもつけません)。 データベースが存在しなければ、MODE MASK (を umask で修正したもの) で 指定されたモードで作られます。 古い DBM 関数のみをサポートしているシステムでは、プログラム中で 1 度だけ dbmopen() を実行することができます。 昔のバージョンの Perl では、DBM も ndbm も持っていないシステムでは、 dbmopen() を呼び出すと致命的エラーになります。 現在では sdbm(3) にフォールバックします。

DBM ファイルに対して、書き込み権が無いときには、ハッシュ 配列を読みだすことだけができ、設定することはできません。 書けるか否かを調べたい場合には、ファイルテスト 演算子を使うか、エラーをトラップしてくれる、eval の中で、ダミーのハッシュエントリを設定してみることになります。

大きな DBM ファイルを扱うときには、keysvalues のような関数は、 巨大なリストを返します。 大きな DBM ファイルでは、each 関数を使って繰り返しを行なった方が 良いかもしれません。 例:

    # print out history file offsets
    dbmopen(%HIST,'/usr/lib/news/history',0666);
    while (($key,$val) = each %HIST) {
        print $key, ' = ', unpack('L',$val), "\n";
    }
    dbmclose(%HIST);

様々な dbm 手法に対する利点欠点に関するより一般的な記述および 特にリッチな実装である DB_File に関しては AnyDBM_File も参照してください。

dbmopen() を呼び出す前にライブラリを読み込むことで、 どの DBM ライブラリを使うかを制御できます:

    use DB_File;
    dbmopen(%NS_Hist, "$ENV{HOME}/.netscape/history.db")
        or die "Can't open netscape history file: $!";
defined EXPR
defined

左辺値 EXPR が未定義値 undef 以外の値を持つか否かを示す、ブール値を 返します。 EXPR がない場合は、$_ がチェックされます。

多くの演算子が、EOF や未初期化変数、システムエラーといった、 例外的な条件で undef を返すようになっています。 この関数は、他の値と undef とを区別するために使えます。 (単純な真偽値テストでは、undef、0、"0" のいずれも偽を返すので、 区別することができません。) undef は有効なスカラ値なので、その存在が 必ずしも 例外的な状況を表すとは限らないということに注意してください: pop は引数が空の配列だったときに undef を返しますが、 あるいは 返すべき要素がたまたま undef だったのかもしれません。

defined(&func) とすることでサブルーチン &func の存在を、 確かめることもできます。 返り値は &func の前方定義には影響されません。 定義されていないサブルーチンも呼び出し可能であることに注意してください。 最初に呼び出されたときに存在するようにするための AUTOLOAD メソッドを持ったパッケージかもしれません-- perlsub を参照して下さい。

集合(ハッシュや配列)への defined の使用は非推奨です。 これはその集合にメモリが割り当てられたかを報告するのに 用いられていました。 この振る舞いは将来のバージョンの Perl では消滅するかもしれません。 代わりにサイズに対する簡単なテストを使うべきです。

    if (@an_array) { print "has array elements\n" }
    if (%a_hash)   { print "has hash members\n"   }

ハッシュの要素に対して用いると、value が定義されているか否かを 返すものであって、ハッシュに key が存在するか否かを返すのではありません。 この用途には、exists を使ってください。

例:

    print if defined $switch{'D'};
    print "$val\n" while defined($val = pop(@ary));
    die "Can't readlink $sym: $!"
        unless defined($value = readlink $sym);
    sub foo { defined &$bar ? &$bar(@_) : die "No bar"; }
    $debugging = 0 unless defined $debugging;

注意: 多くの人々が defined を使いすぎて、0""(空文字列) が 実際のところ定義された値であることに驚くようです。 例えば、以下のように書くと:

    "ab" =~ /a(.*)b/;

パターンマッチングが成功し、$1 が定義されても、実際には 「なし」にマッチしています。 しかしこれは何にもマッチしていないわけではありません。 何かにはマッチしているのですが、たまたまそれが長さ 0 だっただけです。 これは非常に率直で正直なことです。 関数が未定義値を返すとき、正直な答えを返すことができないことを 告白しています。 ですので、あなたが自分がしようとしていることの完全性を確認するときにだけ defined を使うべきです。 その他の場合では、単に 0 または "" と比較するというのがあなたの 求めているものです。

undef, exists, ref も参照してください。

delete EXPR

ハッシュ要素、配列要素、ハッシュスライス、配列スライスを指定する式を取り、 指定された要素をハッシュや配列からを削除します。 配列の場合、配列要素が最後にあった場合は、 配列の大きさは exists() が真を返す最後尾の要素に縮みます (そのような要素がない場合は 0 になります)。

削除をしようとしたようその数と同じ数の要素からなるリストを返します。 このリストの各要素は、削除された値か未定義値のどちらかです。 スカラコンテキストでは、これは削除された最後の要素(または削除された要素が ない場合は未定義値)を得ることを意味します。

    %hash = (foo => 11, bar => 22, baz => 33);
    $scalar = delete $hash{foo};             # $scalar is 11
    $scalar = delete @hash{qw(foo bar)};     # $scalar is 22
    @array  = delete @hash{qw(foo bar baz)}; # @array  is (undef,undef,33)

%ENV から削除を行なうと、実際に環境変数を変更します。 DBM ファイルに tie された配列からの削除は、その DBM ファイルからエントリを 削除します。 しかし、tie されたハッシュや配列からの削除は、 値を返すとは限りません。

配列要素を削除した場合、配列の位置は初期の、初期化されていない状態になります。 引き続いて同じ要素に対して exists() でテストすると偽を返します。 また、配列の途中の配列要素を削除してもインデックスはシフトしません。 このためには splice() を使ってください。 exists を参照してください。

以下は、%HASH と @ARRAY のすべての値を(非効率的に)削除します:

    foreach $key (keys %HASH) {
        delete $HASH{$key};
    }
    foreach $index (0 .. $#ARRAY) {
        delete $ARRAY[$index];
    }

そして以下のようにもできます:

    delete @HASH{keys %HASH};
    delete @ARRAY[0 .. $#ARRAY];

しかし、これら二つは単に空リストを代入するか、%HASH や @ARRAY を undef するより遅いです:

    %HASH = ();         # completely empty %HASH
    undef %HASH;        # forget %HASH ever existed
    @ARRAY = ();        # completely empty @ARRAY
    undef @ARRAY;       # forget @ARRAY ever existed

最終的な操作がハッシュ要素、配列要素、ハッシュスライス、配列スライスの いずれかである限りは、EXPR には任意の複雑な式を置くことができることに 注意してください:

    delete $ref->[$x][$y]{$key};
    delete @{$ref->[$x][$y]}{$key1, $key2, @morekeys};
    delete $ref->[$x][$y][$index];
    delete @{$ref->[$x][$y]}[$index1, $index2, @moreindices];
die LIST

eval の外では、LIST の値を STDERR に出力し、その時点の $! (errno) の値で exit します。 $! の値が 0 ならば、 ($? >> 8) (backtick `command` のステータス) の値で exitします。 ($? >> 8)0 であれば、255 で exit することになります。 eval の中で使用すると、エラーメッセージが、 $@ に入れられます。 eval は中断され、未定義値を返します。 これが die が例外を発生させる方法です。

等価な例:

    die "Can't cd to spool: $!\n" unless chdir '/usr/spool/news';
    chdir '/usr/spool/news' or die "Can't cd to spool: $!\n"

LIST の最後の要素が改行で終わっていなければ、その時点の スクリプト名とスクリプトの行番号、(もしあれば) 入力ファイルの行番号と改行文字が、続けて表示されます。 「入力行番号」("chunk" とも呼ばれます)は 「行」という概念が現在有効であると仮定しています。 また特殊変数 $. でも利用可能です。 $/ in perlvar$. in perlvar も参照してください。

ヒント: メッセージの最後を ", stopped" のようなもので 終わるようにしておけば、"at foo line 123" のように 追加されて、わかりやすくなります。 "canasta" というスクリプトを実行しているとします。

    die "/etc/games is no good";
    die "/etc/games is no good, stopped";

これは、それぞれ以下のように表示します。

    /etc/games is no good at canasta line 123.
    /etc/games is no good, stopped at canasta line 123.

exit()warn() と Carp モジュールも参照してください。

LIST が空で $@ が(典型的には前回の eval で)既に値を持っている場合、 値は "\t...propagated" を追加した後再利用されます。 これは例外を伝播させる場合に有効です:

    eval { ... };
    die unless $@ =~ /Expected exception/;

LIST が空で、$@PROPAGATE メソッドを含むオブジェクトへの リファレンスを含む場合、このメソッドが追加ファイルと行番号を引数として 呼び出されます。 返り値は $@ の値を置き換えます。 つまり、$@ = eval { $@->PROPAGATE(__FILE__, __LINE__) }; が 呼び出されたかのようになります。

$@ が空の場合、"Died" が使われます。

die() はリファレンス引数と共に呼び出すこともできます。 eval() 内部でこのように呼び出された場合、$@ はリファレンスを持ちます。 この振る舞いは、例外の性質にすいて任意の状態を管理するオブジェクトを使った より複雑な例外ハンドリングの実装を可能にします。 このようなスキーマは $@ の特定の文字列値を正規表現を使って マッチングするときに時々好まれます。 $@ はグローバル変数で、eval() はオブジェクト実装の内部で 使われることがあるので、エラーオブジェクトの解析はグローバル変数の リファレンスを置き換えないことに注意を払わなければなりません。 最も簡単な解決方法は、他の操作をする前にリファレンスのローカルコピーを 作ることです。 以下に例を示します:

    use Scalar::Util 'blessed';
    eval { ... ; die Some::Module::Exception->new( FOO => "bar" ) };
    if (my $ev_err = $@) {
        if (blessed($ev_err) && $ev_err->isa("Some::Module::Exception")) {
            # handle Some::Module::Exception
        }
        else {
            # handle all other possible exceptions
        }
    }

perl は捕らえられなかった例外のメッセージを表示する前に文字列化するので、 このようなカスタム例外オブジェクトの文字列化をオーバーロードしたいと 思うかもしれません。 これに関する詳細は overload を参照してください。

$SIG{__DIE__} フックをセットすることで、die がその行動を行う 直前に実行されるコールバックを設定できます。 結び付けられたハンドラはエラーテキストと共に呼び出され、 必要なら再び die を呼び出すことでエラーテキストを変更できアス。 %SIG のエントリをセットする詳細については、$SIG{expr} in perlvar を、 例については eval BLOCK を参照してください。 この機能はプログラムが終了しようとする前に 1 回だけ実行していましたが、 現在ではそうではありません -- $SIG{__DIE__} フックは eval() されたブロック/文字列の中でも 呼ばれるのです! もしそのような状況で何もしなくない時は:

        die @_ if $^S;

をハンドラの最初の行に置いてください($^S in perlvar を参照してください)。 これは離れたところで不思議な行動を引き起こすので、 この直感的でない振る舞いは将来のリリースで修正されるかもしれません。

do BLOCK

実際は関数ではありません。 BLOCK で示されるコマンド列の最後の値を返します。 whileuntil ループ修飾子で修飾すると、 ループ条件を調べる前に 1 度、BLOCK を実行します。 (これ以外の実行文は、ループ修飾子により、条件が最初に 調べられます。)

do BLOCK はループとしては 扱われません。 従って、next, last, redo といったループ制御文は ブロックから抜けたり再開することはできません。 その他の戦略については perlsyn を参照して下さい。

do SUBROUTINE(LIST)

この形のサブルーチン呼び出しは非推奨です。 perlsub を参照してください。

do EXPR

EXPR の値をファイル名として用い、そのファイルの中身を Perl のスクリプトとして実行します。

    do 'stat.pl';

は以下のものと同じようなものですが、

    eval `cat stat.pl`;

より効率的で、簡潔であり、エラーメッセージでファイル名がわかる、 カレントディレクトリでファイルが見つからなかったときに @INC ディレクトリを検索する、ファイルがあったときに %INC を更新する、 といったことがあります。 Predefined Names in perlvar も参照してください。 do FILENAME で評価されたコードは、入れ子のスコープにある レキシカル変数を見ることができないのに対し、eval STRINGではできる、 という違いがあります。 しかし、呼び出すたびにファイルを解析し直すという点では同じですから、 ループ内でこれを使おうなどとは、間違っても思ったりしないように。

doがファイルを読み込めなかった場合、undef を返して $! に エラーを設定します。 do がファイルを読み込めたがコンパイルできなかった場合、 undef を返して $@ にエラーメッセージを設定します。 ファイルのコンパイルに成功した場合、do は最後に評価した表現の値を返します。

ライブラリモジュールのインクルードには、use 演算子や require 演算子を使った方がよいことに注意してください。 これらは自動的にエラーをチェックして、問題があれば例外を発生させます。

do をプログラム設定ファイルを読み込むのに使いたいかもしれません。 手動のエラーチェックは以下のようにして行えます:

    # read in config files: system first, then user
    for $file ("/share/prog/defaults.rc",
               "$ENV{HOME}/.someprogrc")
   {
        unless ($return = do $file) {
            warn "couldn't parse $file: $@" if $@;
            warn "couldn't do $file: $!"    unless defined $return;
            warn "couldn't run $file"       unless $return;
        }
    }
dump LABEL
dump

この関数は即座にコアダンプを行ないます。 同様のことを行う perlrun-u オプションも参照してください。 プログラムの先頭で、 すべての変数を初期化したあとのコアダンプを undump プログラム(提供していません)を使って実行ファイルに返ることができます。 この新しいバイナリが実行されると、goto LABEL から始めます (goto に関する制限はすべて適用されます)。 コアダンプをはさんで再生する goto と考えてください。 LABEL が省略されると、プログラムを先頭から再開します。

警告: dump 時点でオープンされていたファイルは、 プログラムが再生されたときには、もはやオープンされていません。 Perl を部分的に混乱させる可能性があります。

この関数は大幅に時代遅れのものです; 主な理由としては、コアファイルを 実行形式に変換するのが非常に困難であることです。 これが、今ではタイプミスの可能性を警告されたくないなら CORE::dump() として起動するべき理由です。

each HASH

リストコンテキストで呼び出した場合は、 ハッシュの次の 要素 に対する、key と 要素 からなる 2 要素のリストを返しますので、ハッシュ上での繰り返しを 行なうことができます。 スカラコンテキストで呼び出した場合は、 ハッシュの次の要素のための key を返します。

エントリは見かけ上、ランダムな順序で返されます。 実際のランダムな順番は perl の将来のバージョンでは変わるかもしれませんが、 keysvalues 関数が同じ(変更されていない)ハッシュに対して 生成するのと同じ順番であることは保証されます。 Perl 5.8.1 以降ではセキュリティ上の理由により、 実行される毎に順番は変わります (Algorithmic Complexity Attacks in perlsec を参照してください)。

ハッシュをすべて読み込んでしまうと、リストコンテキストでは空配列が 返されます(これは代入されると、偽 (0) となります)。 スカラコンテキストでは undef が返されます。 そのあと、もう一度 each を呼び出すと、 再び繰り返しを始めます。 ハッシュごとに反復子が 1 つあり、プログラム中のすべての each 関数、keys 関数、values 関数で共用されます。 反復子は、配列の要素をすべて読むことによって、またはkeys HASH, values HASHを評価することでリセットすることができます。 繰り返しを行なっている間に、ハッシュに要素を追加したり削除したりすると、 要素が飛ばされたり重複したりするので、してはいけません。 例外: 一番最近に each() から返されたものを削除するのは常に安全です。 これは以下のようなコードが正しく動くことを意味します:

        while (($key, $value) = each %hash) {
          print $key, "\n";
          delete $hash{$key};   # This is safe
        }

以下のプログラムは、順番が異なるものの、 printenv(1) プログラムのように環境変数を表示します:

    while (($key,$value) = each %ENV) {
        print "$key=$value\n";
    }

keysvaluessort も参照してください。

eof FILEHANDLE
eof ()
eof

次に FILEHANDLE 上で読み込みを行なったときに、 EOF が返されるときか、 FILEHANDLE がオープンされていないと、1 を返します。 FILEHANDLE は、値が実際のファイルハンドルを示す式であってもかまいません。 (この関数は、実際に文字を読み、ungetc を行ないますので、 対話型の場合には、それ程有用ではありません。) 端末ファイルは EOF に達した後にさらに読み込んだり eof(FILEHANDLE) を 呼び出したりしてはいけません。 そのようなことをすると、端末のようなファイルタイプは EOF 状態を失ってしまうかもしれません。

引数を省略した eof は、最後に読み込みを行なったファイルを使います。 空の括弧をつけた eof() は大きく異なります。 これはコマンドラインのファイルリストで構成され、<> 演算子経由で アクセスされる擬似ファイルを示すために用いられます。 通常のファイルハンドルと違って <> は明示的にオープンされないので、 <> を使う前に eof() を使うと、 入力が正常か確認するために @ARGV がテストされます。 同様に、<> の後の eof() で EOF が返るのは、 他の @ARGV リストを処理していると仮定し、もし @ARGV を セットしていないときは STDIN から読み込みます; I/O Operators in perlop を参照してください。

while (<>) ループの中では、個々のファイルの終わりを調べるには、 eofeof(ARGV) を用います。 eof() は最後のファイルの終わりのみを調べます。 例:

    # reset line numbering on each input file
    while (<>) {
        next if /^\s*#/;        # skip comments
        print "$.\t$_";
    } continue {
        close ARGV  if eof;     # Not eof()!
    }
    # insert dashes just before last line of last file
    while (<>) {
        if (eof()) {            # check for end of last file
            print "--------------\n";
        }
        print;
        last if eof();          # needed if we're reading from a terminal
    }

現実的なヒント: Perl で eof が必要となることは、ほとんどありません。 基本的には、 データがなくなったときやエラーがあったときに、入力演算子が undef を返してくれるからです。

eval EXPR
eval BLOCK
eval

第一の形式では、EXPR の返り値が Perl のプログラムであるかのように 解析され、実行されます。 式の値(それ自身スカラコンテキストの中で決定されます)はまずパースされ、 エラーがなければ Perl プログラムのレキシカルコンテキストの中で実行されますので、変数の設定、 サブルーチンやフォーマットの定義は、その後も残っています。  返される値は eval が実行されるごとにパースされることに注意してください。 EXPR を省略すると、$_ を評価します。 この形は主に EXPR のテキストのパースと実行を実行時にまで 遅延させるのに用います。

第二の形式では、BLOCK 内部のコードは一度だけパースされ -- コードを 囲む eval 自身がパースされるのと同じ時点です -- 現在の Perl プログラムの コンテキストで実行されます。 この形式は典型的には第一の形式より効率的に例外をトラップします(後述)。 また BLOCK 内部のコードはコンパイル時にチェックされるという利点を提供します。

最後のセミコロンは、もしあれば、EXPR の値や BLOCK の中身から省くことができます。

どちらの形式でも、返される値はミニプログラムの内部で最後に評価された 表現の値です; サブルーチンと同様、return 文も使えます。 返り値として提供される表現は、eval 自身のコンテキストに依存して 無効・スカラ・リストのいずれかのコンテキストで評価されます。 評価コンテキストの決定方法についての詳細は wantarray を参照してください。

構文エラーや実行エラーが発生するか、die 文が実行されると、 eval の値として未定義値が返され、$@ にエラーメッセージが設定されます。 エラーがなければ、$@ は、空文字列であることが保証されます。  eval を、STDERR に警告メッセージを表示させない目的や、 警告メッセージを $@ に格納する目的では使わないでください。 そのような用途では、$SIG{__WARN__} 機能を使うか、 no warnings 'all' を使って BLOCK か EXPR の内部での警告を オフにする必要があります。 warn, perlvar, warnings, perllexwarn を参照してください。

eval は、致命的エラーとなるようなものをトラップすることができますから、 (socketsymlink といった) 特定の機能が実装されているかを、 調べるために使うことができることに注意してください。 die 演算子が例外を発生させるものとすれば、 これはまた、Perl の例外捕捉機能と捉えることもできます。

実行するコードが変わらないのであれば、毎回多量の再コンパイルすることなしに、 実行時エラーのトラップを行なうために、 eval-BLOCK 形式を使うことができます。 エラーがあれば、やはり $@ に返されます。 例:

    # make divide-by-zero nonfatal
    eval { $answer = $a / $b; }; warn $@ if $@;
    # same thing, but less efficient
    eval '$answer = $a / $b'; warn $@ if $@;
    # a compile-time error
    eval { $answer = };                 # WRONG
    # a run-time error
    eval '$answer =';   # sets $@

eval{} 形式をライブラリの例外を捕捉するために使うときには 問題があります。 現在の __DIE__ フックの状態はほぼ確実に壊れているという理由で、 ユーザーのコードが設定した __DIE__ フックを実行したくないかもしれません。 この目的には以下の例のように、local $SIG{__DIE__} 構造が使えます。

    # a very private exception trap for divide-by-zero
    eval { local $SIG{'__DIE__'}; $answer = $a / $b; };
    warn $@ if $@;

これは特に顕著です。与えられた __DIE__ フックは die をもう一度 呼び出すことができ、これによってエラーメッセージを変える効果があります:

    # __DIE__ hooks may modify error messages
    {
       local $SIG{'__DIE__'} =
              sub { (my $x = $_[0]) =~ s/foo/bar/g; die $x };
       eval { die "foo lives here" };
       print $@ if $@;                # prints "bar lives here"
    }

これは距離の離れた行動であるため、この直感的でない振る舞いは 将来のリリースでは修正されるかもしれません。

eval では、以下のような場合に、 何が調べられるかに特に注意しておくことが必要です:

    eval $x;            # CASE 1
    eval "$x";          # CASE 2
    eval '$x';          # CASE 3
    eval { $x };        # CASE 4
    eval "\$$x++";      # CASE 5
    $$x++;              # CASE 6

上記の CASE 1 と CASE 2 の動作は同一で、変数 $x 内の コードを実行します。 (ただし、CASE 2 では、必要のないダブルクォートによって、 読む人が何が起こるか混乱することでしょう (何も起こりませんが)。) 同様に CASE 3 と CASE 4 の動作も等しく、$x の値を返す以外に 何もしない $x というコードを実行します (純粋に見た目の問題で、CASE 4 が好まれますが、 実行時でなくコンパイル時にコンパイルされるという利点もあります)。 CASE 5 の場合は、通常ダブルクォートを使用します。 この状況を除けば、CASE 6 のように、単に シンボリックリファレンスを使えば良いでしょう。

eval BLOCK はループとして 扱われません。 従って、next, last, redo といったループ制御文でブロックから離れたり 再実行したりはできません。

とても特殊な場合として、DB パッケージ内で eval '' を実行すると、 通常のレキシカルスコープではなく、これを呼び出した最初の非 DB コード片の スコープになります。 Perl デバッガを書いているのでない限り、普通はこれについて心配する必要は ありません。

exec LIST
exec PROGRAM LIST

exec 関数は、システムのコマンドを実行し、戻ってはきません。 戻って欲しい場合には、execではなく system 関数を使ってください。 コマンドが存在せず、しかも システムのコマンドシェル経由でなく 直接コマンドを実行しようとした場合にのみこの関数は失敗して偽を返します。

system の代わりに exec を使うというよくある間違いを防ぐために、 引き続く文が die, warn, exit(-w がセットされている場合 - でもいつもセットしてますよね) 以外の場合、Perl は警告を出します。 もし 本当に exec の後に他の文を書きたい場合、 以下のどちらかのスタイルを使うことで警告を回避できます:

    exec ('foo')   or print STDERR "couldn't exec foo: $!";
    { exec ('foo') }; print STDERR "couldn't exec foo: $!";

LIST に複数の引数がある場合か、LIST が複数の値を持つ 配列の場合には、LIST の引数を使って、execvp(3) を呼び出します。 1 つのスカラ引数のみまたは要素が 1 つの配列の場合には、その引数から シェルのメタ文字をチェックし、もし、メタ文字があれば、 引数全体をシステムのコマンドシェル(これはUnix では /bin/sh -c ですが、システムによって異なります)に渡して解析させます。 もし、メタキャラクタがなければ、その引数を単語に分け、 より効率的な execvp に直接渡します。 例:

    exec '/bin/echo', 'Your arguments are: ', @ARGV;
    exec "sort $outfile | uniq";

第一引数に指定するものを本当に実行したいが、実行する プログラムに対して別の名前を教えたい場合には、LISTの前に、 「間接オブジェクト」(コンマなし) として、実際に 実行したいプログラムを指定することができます。 (これによって、LIST に単一のスカラしかなくても、複数 値のリストであるように、LIST の解釈を行ないます。) 例:

    $shell = '/bin/csh';
    exec $shell '-sh';          # pretend it's a login shell

あるいは、より直接的に、

    exec {'/bin/csh'} '-sh';    # pretend it's a login shell

引数がシステムシェルで実行されるとき、結果はシェルの奇癖と能力によって 変わります。 詳細については `STRING` in perlop を参照してください。

execsystem で間接オブジェクトを使うのもより安全です。 この使い方(system() でも同様にうまく動きます)は、たとえ引数が一つだけの 場合も、複数の値を持つリストとして引数を解釈することを強制します。 この方法で、シェルによるワイルドカード展開や、空白による単語の分割から 守られます。

    @args = ( "echo surprise" );
    exec @args;               # subject to shell escapes
                                # if @args == 1
    exec { $args[0] } @args;  # safe even with one-arg list

間接オブジェクトなしの一つ目のバージョンでは、echo プログラムが実行され、 "surprise" が引数として渡されます。 二つ目のバージョンでは違います -- 文字通り "echo surprise" という名前の プログラムを実行しようとして、見つからないので、失敗したことを示すために $? に非 0 がセットされます。

v5.6.0 から、Perl は exec の前に出力用に開かれている全てのファイルを フラッシュしようとしますが、これに対応していないプラットフォームもあります (perlport を参照してください)。 安全のためには、出力が重複するのを避けるために、全てのオープンしている ハンドルに対して $| (English モジュールでは $AUTOFLUSH) を設定するか、 IO::Handle モジュールの autoflush() メソッドをを呼ぶ必要が あるかもしれません。

execEND ブロックや、オブジェクトの DESTROY メソッドを 呼び出さないことに注意してください。

exists EXPR

ハッシュ要素か配列要素を示す表現が与えられ、 指定された要素が、ハッシュか配列に存在すれば、 たとえ対応する value が未定義でも真を返します。 要素が存在しなかった場合は自動活性化されません。

    print "Exists\n"    if exists $hash{$key};
    print "Defined\n"   if defined $hash{$key};
    print "True\n"      if $hash{$key};
    print "Exists\n"    if exists $array[$index];
    print "Defined\n"   if defined $array[$index];
    print "True\n"      if $array[$index];

ハッシュまたは配列要素は、定義されているときにのみ真となり、 存在しているときにのみ定義されますが、逆は必ずしも真ではありません。

引数としてサブルーチンの名前が指定された場合、 指定されたサブルーチンが宣言されていれば(たとえ未定義でも) 真を返します。 exists や defined のために言及されているサブルーチン名は 宣言としてのカウントに入りません。 存在しないサブルーチンでも呼び出し可能かもしれないことに注意してください: パッケージが AUTOLOAD メソッドを持っていて、最初に呼び出された時に 存在を作り出すかもしれません -- perlsub を参照してください。

    print "Exists\n"    if exists &subroutine;
    print "Defined\n"   if defined &subroutine;

最終的な操作がハッシュや配列の key による検索またはサブルーチン名である限りは、 EXPR には任意の複雑な式を置くことができます:

    if (exists $ref->{A}->{B}->{$key})  { }
    if (exists $hash{A}{B}{$key})       { }
    if (exists $ref->{A}->{B}->[$ix])   { }
    if (exists $hash{A}{B}[$ix])        { }
    if (exists &{$ref->{A}{B}{$key}})   { }

ネストした配列やハッシュの一番深い部分は、その存在をテストしただけでは 存在するようにはなりませんが、途中のものは存在するようになります。 従って $ref->{"A"}$ref->{"A"}->{"B"} は上記の $key の 存在をテストしたことによって存在するようになります。 これは、矢印演算子が使われるところでは、以下のようなものを含むどこででも 起こります。

    undef $ref;
    if (exists $ref->{"Some key"})      { }
    print $ref;             # prints HASH(0x80d3d5c)

一目見ただけでは -- あるいは二目見ても -- 驚かされる、左辺値コンテキストでの 自動有効化は将来のリリースでは修正されるでしょう。

exists() の引数としてサブルーチン名でなくサブルーチン呼び出しを使うと、 エラーになります。

    exists &sub;        # OK
    exists &sub();      # Error
exit EXPR
exit

EXPR を評価し、即座にその値を持って終了します。 例:

    $ans = <STDIN>;
    exit 0 if $ans =~ /^[Xx]/;

die も参照してください。 EXPR が省略された場合には、ステータスを 0 として終了します。 EXPR の値として広く利用可能なのは 0 が成功で 1 がエラーということだけです。 その他の値は、 Perl が実行される環境によって異なる解釈がされる 可能性があります。 例えば、sendmail 到着メールフィルタから 69 (EX_UNAVAILABLE) で終了すると メーラーはアイテムを配達せずに差し戻しますが、 これはいつでも真ではありません。

誰かが発生したエラーをトラップしようと考えている可能性がある場合は、 サブルーチンの中断に exit を使わないでください。 代わりに eval でトラップできる die を使ってください。

exit() 関数は常に直ちに終了するわけではありません。 まず、定義されている END ルーチンを呼び出しますが、 END ルーチン自身は exit を止められません。 同様に、呼び出す必要のあるオブジェクトデストラクタは すべて、実際の終了前に呼び出されます。 これが問題になる場合は、END やデストラクタが実行されることを 防ぐために POSIX:_exit($status) を呼び出してください。 詳しくは perlmod を参照してください。

exp EXPR
exp

e (自然対数の底) の EXPR 乗を返します。  EXPR を省略した場合には、exp($_) を返します。

fcntl FILEHANDLE,FUNCTION,SCALAR

fcntl(2) 関数を実装します。 正しい定数定義を得るために、まず、

    use Fcntl;

と書くことが必要でしょう。 引数の処理と返り値については、下記の ioctl と同様に動作します。 例:

    use Fcntl;
    fcntl($filehandle, F_GETFL, $packed_return_buffer)
        or die "can't fcntl F_GETFL: $!";

fcntl からの返り値のチェックに defined を使う必要はありません。 ioctl と違って、fnctl はシステムコールの結果が 0 だった場合は "0 だが真"を返します。 この文字列は真偽値コンテキストでは真となり、 数値コンテキストでは 0 になります。 これはまた、不適切な数値変換に関する通常の -w 警告を回避します。

fcntl(2) が実装されていないマシンでは、fcntlは致命的エラーを 引き起こすことに注意してください。 システムでどの関数が利用可能かについては Fcntl モジュールや fcntl(2) man ページを参照してください。

これは REMOTE というファイルハンドルをシステムレベルで 非ブロックモードにセットする例です。 ただし、 $| を自分で管理しなければなりません。

    use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
    $flags = fcntl(REMOTE, F_GETFL, 0)
                or die "Can't get flags for the socket: $!\n";
    $flags = fcntl(REMOTE, F_SETFL, $flags | O_NONBLOCK)
                or die "Can't set flags for the socket: $!\n";
fileno FILEHANDLE

ファイルハンドルに対するファイル記述子を返します。 ファイルハンドルがオープンしていない場合は未定義値を返します。 これは主に select や低レベル POSIX tty 操作に対する、ビットマップを 構成するときに便利です。 FILEHANDLE が式であれば、 その値が間接ファイルハンドル(普通は名前)として使われます。

これを、二つのハンドルが同じ識別子を参照しているかどうかを見つけるのに 使えます:

    if (fileno(THIS) == fileno(THAT)) {
        print "THIS and THAT are dups\n";
    }

(open の新機能によってメモリに接続されたファイルハンドルは、 開いている時でも未定義値を返します。)

flock FILEHANDLE,OPERATION

FILEHANDLE に対して flock(2)、またはそのエミュレーションを呼び出します。 成功時には真を、失敗時には偽を返します。 flock(2), fcntl(2) ロック, lockf(3) のいずれかを実装していない マシンで使うと、致命的エラーが発生します。 flock は Perl の移植性のあるファイルロックインターフェースです。 しかしレコードではなく、ファイル全体のみをロックします。

明白ではないものの、伝統的な flock の動作としては、ロックが得られるまで 無限に待ち続けるものと、単に勧告的に ロックするものの二つがあります。 このような自由裁量のロックはより柔軟ですが、保障されるものはより少ないです。 これは、flock を使わないプログラムが flock でロックされたファイルを 書き換えるかもしれないことを意味します。 詳細については、perlport、システム固有のドキュメント、システム固有の ローカルの man ページを参照してください。 移植性のあるプログラムを書く場合は、伝統的な振る舞いを仮定するのが ベストです。 (しかし移植性のないプログラムを書く場合は、自身のシステムの性癖(しばしば 「仕様」と呼ばれます)に合わせて書くことも完全に自由です。 盲目的に移植性に固執することで、あなたの作業を仕上げるのを邪魔するべきでは ありません。)

OPERATION は LOCK_SH, LOCK_EX, LOCK_UN のいずれかで、LOCK_NB と 組み合わされることもあります。 これらの定数は伝統的には 1, 2, 8, 4 の値を持ちますが、Fcntl モジュールから シンボル名を独立してインポートするか、 ':flock' タグを使うグループとして、 シンボル名をを使うことができます。 LOCK_SH は共有ロックを要求し、LOCK_EX は排他ロックを要求し、LOCK_UN は 前回要求したロックを開放します。 LOCK_NB と LOCK_SH か LOCK_EX がビット単位の論理和されると、flock は ロックを取得するまで待つのではなく、すぐに返ります(ロックが取得できたか どうかは返り値を調べます)。

不一致の可能性を避けるために、Perl はファイルをロック、アンロックする前に FILEHANDLE をフラッシュします。

lockf(3) で作成されたエミュレーションは共有ロックを提供せず、 FILEHANDLE が書き込みモードで開いていることを必要とすることに 注意してください。 これは lockf(3) が実装している動作です。 しかし、全てではないにしてもほとんどのシステムでは fcntl(2) を使って lockf(3) を実装しているので、異なった動作で多くの人々を混乱させることは ないはずです。

flock(3)fcntl(2) エミュレーションは、 LOCK_SH を使うためには FILEHANDLE を読み込みで開いている必要があり、LOCK_EX を使うためには 書き込みで開いている必要があることに注意してください。

ネットワーク越しにはロックできない flock もあることに注意してください; このためには、よりシステム依存な fcntl を使う必要があります。 Perl にシステムの flock(2) 関数を無視させ、自身の fcntl(2) ベースの エミュレーションを使う場合は、perl を設定するときに Configure プログラムに -Ud_flock オプションを渡してください。

BSD システムでのメールボックスへの追加処理の例を示します。

    use Fcntl ':flock'; # import LOCK_* constants
    sub lock {
        flock(MBOX,LOCK_EX);
        # and, in case someone appended
        # while we were waiting...
        seek(MBOX, 0, 2);
    }
    sub unlock {
        flock(MBOX,LOCK_UN);
    }
    open(MBOX, ">>/usr/spool/mail/$ENV{'USER'}")
            or die "Can't open mailbox: $!";
    lock();
    print MBOX $msg,"\n\n";
    unlock();

真の flock() に対応しているシステムではロックは fork() を通して 継承されるのに対して、より不安定な fcntl() に頼らなければならない場合、 サーバを書くのはより難しくなります。

その他の flock() の例としては DB_File も参照してください。

fork

同じプログラムの同じ地点から開始する新しいプロセスを作成するために システムコール fork(2) を行ないます。 親プロセスには、チャイルドプロセスの pid を、 チャイルドプロセスに 0 を返しますが、 fork に失敗したときには、undefを返します。 ファイル記述子(および記述子に関連するロック)は共有され、 その他の全てはコピーされます。 fork() に対応するほとんどのシステムでは、 これを極めて効率的にするために多大な努力が払われてきました (例えば、データページへの copy-on-write テクノロジーなどです)。 これはここ 20 年にわたるマルチタスクに関する主要なパラダイムとなっています。

v5.6.0 から、Perl は子プロセスを fork する前に出力用にオープンしている全ての ファイルをフラッシュしようとしますが、これに対応していないプラットフォームも あります(perlport を参照してください)。 安全のためには、出力が重複するのを避けるために、 全てのオープンしているハンドルに対して $| (English モジュールでは $AUTOFLUSH) を設定するか、 IO::Handle モジュールの autoflush()メソッドをを呼ぶ必要が あるかもしれません。

チャイルドプロセスの終了を待たずに、fork を繰り返せば、 ゾンビをためこむことになります。 $SIG{CHLD}"IGNORE" を指定することでこれを回避できるシステムもあります。 fork と消滅しかけている子プロセスを回収するための更なる例については perlpc も参照してください。

fork した子プロセスが STDIN や STDOUT といったシステムファイル記述子を 継承する場合、(CGI スクリプトやリモートシェルといった バックグラウンドジョブのような)リモートサーバは考え通りに 動かないであろうことに注意してください。 このような場合ではこれらを /dev/null として再オープンするべきです。

format

write 関数で使うピクチャーフォーマットを宣言します。 例:

    format Something =
        Test: @<<<<<<<< @||||| @>>>>>
              $str,     $%,    '$' . int($num)
    .
    $str = "widget";
    $num = $cost/$quantity;
    $~ = 'Something';
    write;

詳細と例については perlform を参照して下さい。

formline PICTURE,LIST

これは、format が使用する内部関数ですが、直接呼び出すこともできます。 これは、PICTURE の内容にしたがって、LIST の値を整形し (perlform を 参照してください)、結果をフォーマット出力アキュムレータ$^A (English モジュールでは $ACCUMULATOR) に納めます。 最終的に、write が実行されると、$^A の中身が、 何らかのファイルハンドルに書き出されます。 また、自分で $^A を読んで、$^A の内容を "" に戻してもかまいません。 format は通常、1 行ごとに formline を行ないますが、 formline 関数自身は、PICTURE の中にいくつの改行が入っているかは、 関係がありません。 これは、~~~トークンは PICTURE 全体を一行として扱うことを意味します。 従って、1 レコードフォーマットを実装するためには フォーマットコンパイラのような複数 formline を使う必要があります。

ダブルクォートで PICTURE を囲む場合には、@ という文字が 配列名の始まりと解釈されますので、注意してください。 formline は常に真を返します。 その他の例については perlform を参照してください。

getc FILEHANDLE
getc

FILEHANDLE につながれている入力ファイルから、次の一文字を返します。 ファイルの最後、またはエラーが発生した場合は、未定義値を返します (後者の場合は $! がセットされます)。 FILEHANDLE が省略された場合には、STDIN から読み込みを行ないます。 これは特に効率的ではありません。 しかし、これはユーザーがリターンキーを押すのを待つことなく 一文字を読み込む用途には使えません。 そのような場合には、以下のようなものを試して見てください:

    if ($BSD_STYLE) {
        system "stty cbreak </dev/tty >/dev/tty 2>&1";
    }
    else {
        system "stty", '-icanon', 'eol', "\001";
    }
    $key = getc(STDIN);
    if ($BSD_STYLE) {
        system "stty -cbreak </dev/tty >/dev/tty 2>&1";
    }
    else {
        system "stty", 'icanon', 'eol', '^@'; # ASCII null
    }
    print "\n";

$BSD_STYLE をセットするべきかどうかを決定する方法については 読者への宿題として残しておきます。

POSIX::getattr 関数は POSIX 準拠を主張するシステムでこれを より移植性のある形で行います。 お近くの CPAN サイトから Term::ReadKey モジュールも参照して下さい; CPAN に関する詳細は CPAN in perlmodlib にあります。

getlogin

これは同じ名前の C ライブラリ関数を実装していて、 多くのシステムでは、もしあれば、/etc/utmp から現在のログイン名を返します。 ヌルであれば、getpwuid() を使ってください。

    $login = getlogin || getpwuid($<) || "Kilroy";

getlogin を認証に使ってはいけません。 これは getpwuid のように安全ではありません。

getpeername SOCKET

SOCKET コネクションの向こう側のパックされた aockaddr アドレスを返します。

    use Socket;
    $hersockaddr    = getpeername(SOCK);
    ($port, $iaddr) = sockaddr_in($hersockaddr);
    $herhostname    = gethostbyaddr($iaddr, AF_INET);
    $herstraddr     = inet_ntoa($iaddr);
getpgrp PID

指定された PID の現在のプロセスグループを返します。 PID に 0 を与えるとカレントプロセスの指定となります。 getpgrp(2) を実装していないマシンで実行した場合には、例外が発生します。 PID を省略するとカレントプロセスのプロセスグループを返します。 POSIX 版の getpgrp は PID 引数を受け付けないので、 PID==0 のみが完全に移植性があります。

getppid

親プロセスのプロセス id を返します。

Linux ユーザーへの注意: Linux では getpid()getppid() の C 関数は スレッドが異なると異なった値を返します。 移植性のために、この振る舞いは perl レベルの関数 getppid() には 反映されず、スレッドをまたいで一貫性のある値を返します。 基礎となる getppid() を呼び出したい場合は、CPAN モジュールである Linux::Pid を使ってください。

getpriority WHICH,WHO

プロセス、プロセスグループ、ユーザに対する現在の優先度を返します。 (getpriority(2) を参照してください。) getpriority(2) を実装していない マシンで実行した場合には、致命的例外が発生します。

getpwnam NAME
getgrnam NAME
gethostbyname NAME
getnetbyname NAME
getprotobyname NAME
getpwuid UID
getgrgid GID
getservbyname NAME,PROTO
gethostbyaddr ADDR,ADDRTYPE
getnetbyaddr ADDR,ADDRTYPE
getprotobynumber NUMBER
getservbyport PORT,PROTO
getpwent
getgrent
gethostent
getnetent
getprotoent
getservent
setpwent
setgrent
sethostent STAYOPEN
setnetent STAYOPEN
setprotoent STAYOPEN
setservent STAYOPEN
endpwent
endgrent
endhostent
endnetent
endprotoent
endservent

これらのルーチンは、システムライブラリの同名の関数を実行します。 リストコンテキストでは、さまざまな get ルーチンからの返り値は、次のようになります:

    ($name,$passwd,$uid,$gid,
       $quota,$comment,$gcos,$dir,$shell,$expire) = getpw*
    ($name,$passwd,$gid,$members) = getgr*
    ($name,$aliases,$addrtype,$length,@addrs) = gethost*
    ($name,$aliases,$addrtype,$net) = getnet*
    ($name,$aliases,$proto) = getproto*
    ($name,$aliases,$port,$proto) = getserv*

(エントリが存在しなければ、空リストが返されます。)

$gcos フィールドの正確な意味はさまざまですが、通常は(ログイン名ではなく) ユーザーの実際の名前とユーザーに付随する情報を含みます。 但し、多くのシステムではユーザーがこの情報を変更できるので、この情報は 信頼できず、従って $gcos は汚染されます(perlsec を参照してください)。 ユーザーの暗号化されたパスワードとログインシェルである $passwd と $shell も、同様の理由で汚染されます。

スカラコンテキストでは、*nam、*byname といった NAME で検索するもの以外は、 name を返し、NAME で検索するものは、何か別のものを返します。 (エントリが存在しなければ、未定義値が返ります。) 例:

    $uid   = getpwnam($name);
    $name  = getpwuid($num);
    $name  = getpwent();
    $gid   = getgrnam($name);
    $name  = getgrgid($num);
    $name  = getgrent();
    #etc.

getpw*() では、$quota, $comment, $expire フィールドは、 多くのシステムでは対応していないので特別な処理がされます。 $quota が非対応の場合、空のスカラになります。 対応している場合、通常はディスククォータの値が入ります。 $comment フィールドが非対応の場合、空のスカラになります。 対応している場合、通常はユーザーに関する管理上のコメントが入ります。 $quota フィールドはパスワードの寿命を示す $change や $age である システムもあります。 $comment フィールドは $class であるシステムもあります。 $expire フィールドがある場合は、アカウントやパスワードが時間切れになる 期間が入ります。 動作させるシステムでのこれらのフィールドの有効性と正確な意味については、 getpwnam(3) のドキュメントと pwd.h ファイルを参照してください。 $quota と $comment フィールドが何を意味しているかと、$expire フィールドが あるかどうかは、Config モジュールを使って、d_pwquota, d_pwage, d_pwchange, d_pwcomment, d_pwexpire の値を調べることによって Perl 自身で調べることも出来ます。 シャドウパスワードは、通常の C ライブラリルーチンを権限がある状態で 呼び出すことでシャドウ版が取得できるか、System V にあるような (Solaris と Linux を含みます) shadow(3) 関数があるといった、 直感的な方法で実装されている場合にのみ対応されます。 独占的なシャドウパスワード機能を実装しているシステムでは、 それに対応されることはないでしょう。

getgr*() によって返る値 $members は、グループのメンバの ログイン名をスペースで区切ったものです。

gethost*() 関数では、C で h_errno 変数がサポートされていれば、 関数呼出が失敗したときに、$? を通して、その値が返されます。 成功時に返される @addrs 値は、対応するシステムコールが返す、 生のアドレスのリストです。 インターネットドメインでは、個々のアドレスは、4 バイト長で、 以下のようにして unpack することができます。

    ($a,$b,$c,$d) = unpack('W4',$addr[0]);

Socket ライブラリを使うともう少し簡単になります。

    use Socket;
    $iaddr = inet_aton("127.1"); # or whatever address
    $name  = gethostbyaddr($iaddr, AF_INET);
    # or going the other way
    $straddr = inet_ntoa($iaddr);

逆方向に、ホスト名から IP アドレスを解決するには以下のように書けます:

    use Socket;
    $packed_ip = gethostbyname("www.perl.org");
    if (defined $packed_ip) {
        $ip_address = inet_ntoa($packed_ip);
    }

gethostbyname() はスカラコンテキストで呼び出すようにして、返り値が 定義されているかを必ずチェックしてください。

返り値のリストの何番目がどの要素かを覚えるのに疲れたなら、 名前ベースのインターフェースが標準モジュールで提供されています: File::stat, Net::hostent, Net::netent, Net::protoent, Net::servent, Time::gmtime, Time::localtime, User::grent です。 これらは通常の組み込みを上書きし、 それぞれのフィールドに適切な名前をつけたオブジェクトを返します。 例:

   use File::stat;
   use User::pwent;
   $is_his = (stat($filename)->uid == pwent($whoever)->uid);

同じメソッド(uid)を呼び出しているように見えますが、違います。 なぜなら File::stat オブジェクトは User::pwent オブジェクトとは 異なるからです。

getsockname SOCKET

SOCKET 接続のこちら側の pack された sockaddr アドレスを返します。 複数の異なる IP から接続されるためにアドレスがわからない場合に使います。

    use Socket;
    $mysockaddr = getsockname(SOCK);
    ($port, $myaddr) = sockaddr_in($mysockaddr);
    printf "Connect to %s [%s]\n",
       scalar gethostbyaddr($myaddr, AF_INET),
       inet_ntoa($myaddr);
getsockopt SOCKET,LEVEL,OPTNAME

与えられた LEVEL で SOCKET に関連付けられた OPTNAME と言う名前のオプションを 問い合わせます。 オプションはソケットの種類に依存しした複数のプロトコルレベルに存在することも ありますが、少なくとも最上位ソケットレベル SOL_SOCKET (Socket モジュールで 定義されています)は存在します。 その他のレベルのオプションを問い合わせるには、そのオプションを制御する 適切なプロトコルのプロトコル番号を指定します。 例えば、オプションが TCP プロトコルで解釈されるべきであることを示すためには、 LEVEL は getprotobyname で得られる TCP のプロトコル番号を設定します。

この呼び出しは、要求されたソケットオプションの pack された文字列表現か、 あるいはエラーがある場合は undef を返します(エラーの理由は $! にあります)。 pack された文字列の正確な中身は LEVEL と OPTNAME に依存するので、 詳細についてはシステムドキュメントを確認してください。 しかし、とても一般的な場合というのはオプションが整数の場合で、この場合 結果は unpack の i (あるいは I)フォーマットでデコードできる pack された 整数です。

あるソケットで Nagle のアルゴリズム有効かどうかを調べる例です:

    use Socket qw(:all);
    defined(my $tcp = getprotobyname("tcp"))
        or die "Could not determine the protocol number for tcp";
    # my $tcp = IPPROTO_TCP; # Alternative
    my $packed = getsockopt($socket, $tcp, TCP_NODELAY)
        or die "Could not query TCP_NODELAY socket option: $!";
    my $nodelay = unpack("I", $packed);
    print "Nagle's algorithm is turned ", $nodelay ? "off\n" : "on\n";
glob EXPR
glob

リストコンテキストでは、 EXPR の値を、標準 Unix シェル /bin/csh が行なうように ファイル名の展開を行なった結果のリスト(空かもしれません)を返します。 スカラコンテキストでは、glob はこのようなファイル名展開を繰り返し、 リストがなくなったら undef を返します。 これは、<*.c> 演算子を実装する内部関数ですが、 直接使用することもできます。 EXPR を省略すると、$_が使われます。 <*.c>演算子については I/O Operators in perlop でより詳細に議論しています。

v5.6.0 から、この演算子は標準の File::Glob 拡張を使って 実装されています。 詳細は File::Glob を参照して下さい。

gmtime EXPR
gmtime

localtime と同様に働きますが、返り値はグリニッジ標準時に ローカライズされています。

注意: リストコンテキストで呼び出した時、gmtime が返す末尾の値である $isdst は常に 0 です。 GMT には夏時間はありません。

移植性の問題については perlport/gmtime を参照してください。

goto LABEL
goto EXPR
goto &NAME

goto-LABEL の形式は、LABEL というラベルの付いた文を 探して、そこへ実行を移すものです。 サブルーチンや foreach ループなど、何らかの初期化が必要な構造の中に 入り込むことは許されません。 最適化によってなくなってしまう構造の中にも goto することはできません。 また、sortで与えられたブロックやサブルーチンから外へ出ることもできません。 これ以外は、サブルーチンの外を含む、動的スコープ内の ほとんどすべての場所へ行くために使用できますが、普通は、 lastdie といった別の構造を使った方が良いでしょう。 Perl の作者はこの形式の goto を使う必要を感じたことは、 1 度もありません (Perl では。C は別のお話です)。 (違いは、C にはループ制御と結びついた名前つきのループがないことです。 Perl にはあり、これが他の言語でのほとんどの構造的な goto の使用法を 置き換えます。)

goto-EXPR の形式はラベル名を予測し、このスコープは動的に解決されます。 これにより FORTRAN のような算術 goto が可能になりますが、 保守性を重視するならお勧めしません。

    goto ("FOO", "BAR", "GLARCH")[$i];

goto-&NAME の形式は、その他の goto の形式とはかなり 異なったものです。 実際、これは普通の感覚でいうところのどこかへ行くものでは全くなく、 他の goto が持つ不名誉を持っていません。 現在のサブルーチンを終了し (local() による変更は失われます)、 直ちに現在の @_ の値を使って指定された名前のサブルーチンを呼び出します。 これは、AUTOLOAD サブルーチンが別のサブルーチンをロードして、 その別のサブルーチンが最初に呼ばれたようにするために使われます (ただし、現在のサブルーチンで @_ を修正した場合には、 その別のサブルーチンに伝えられます)。 goto のあとは、caller でさえも、現在のサブルーチンが 最初に呼び出されたと言うことができません。

NAME はサブルーチンの名前である必要はありません; コードリファレンスを 含むスカラ値や、コードリファレンスと評価されるブロックでも構いません。

grep BLOCK LIST
grep EXPR,LIST

これは grep(1) とその親類と同じようなものですが、同じではありません。 特に、正規表現の使用に制限されません。

LIST の個々の要素に対して、BLOCK か EXPR を評価し ($_ は、ローカルに個々の要素が設定されます) 、 その要素のうち、評価した式が真となったものからなるリスト値が返されます。 スカラコンテキストでは、式が真となった回数を返します。 例:

    @foo = grep(!/^#/, @bar);    # weed out comments

あるいは等価な例として:

    @foo = grep {!/^#/} @bar;    # weed out comments

$_ は、LIST の値へのエイリアスですので、LIST の要素を 変更するために使うことができます。 これは、便利でサポートされていますが、 LIST の要素が変数でないと、おかしな結果になります。 同様に、grep は元のリストへのエイリアスを返します。 for ループのインデックス変数がリスト要素のエイリアスであるのと 同様です。 つまり、grep で返されたリストの要素を (foreach, map, または他の grep で)修正すると 元のリストの要素が変更されます。 これはきれいなコードを書こうとする邪魔になることが多いです。

(my $_ として宣言されることによって) $_grep が現れるスコープ内で レキシカルな場合は、ローカルではリスト要素へのエイリアスであることに加えて、 $_ はブロック内でレキシカルでありつづけます; つまり、外側からは見えず、 起こりうる副作用を回避します。

BLOCK や EXPR の結果をリストの形にしたい場合は map を参照してください。

hex EXPR
hex

EXPR を 16 進数の文字列と解釈して、対応する値を返します。 (0, 0x, 0b で始まる文字列の変換には、oct を 参照してください。) EXPR が省略されると、$_ を使用します。

    print h