PERLFUNC(1) USER COMMANDS PERLFUNC(1) NAME perlfunc - Perl の組み込み関数 DESCRIPTION この節の関数は、式の中で項として使うことができます。 これら は、大きく 2 つに分けられます: リスト演算子と名前付き単項演 算子です。 これらの違いは、その後に出て来るコンマとの優先順 位の関係にあります。 (perlop manpage の優先順位の表を参照し てください。) リスト演算子は 2 個以上の引数をとるのに対して、 単項演算子が複数の引数をとることはありません。 つまり、コン マは単項演算子の引数の終わりとなりますが、リスト演算子の場合 には、引数の区切りでしかありません。 単項演算子は一般に、引 数に対してスカラコンテキストを与えるのに対して、スカラ演算子 の場合には、引数に対してスカラコンテキストを与える場合も、リ ストコンテキストを与える場合もあります。 1 つのリスト演算子 が両方のコンテキストを与える場合には、スカラ引数がいくつか並 び、最後にリスト引数が 1 つ続きます。 (リスト引数は 1 つだ けです。) たとえば、splice() は 3 つのスカラ引数に 1 つのリ スト引数が続きます。 後に載せる構文記述では、リストをとり (そのリストの要素にリス トコンテキストを与える) リスト演算子は、引数として LIST をと るように書いています。 そのようなリストには、任意のスカラ引 数の組み合わせやリスト値を含めることができ、リスト値はリスト の中に、個々の要素が展開されたように埋め込まれます。 1 次元 の長いリスト値が形成されることになります。 LIST の要素は、 コンマで区切られている必要がありあます。 以下のリストの関数はすべて、引数の前後の括弧は省略可能となっ ています。 (構文記述では省略しています。) 括弧を使うときに は、単純な (しかし、ときには驚く結果となる) 規則が適用できま す: 関数に見えるならば、それは関数で、優先順位は関係ない。 そう見えなければ、それはリスト演算子か単項演算子で、優先順位 が関係する。 また、関数と開き括弧の間の空白は関係ありません ので、ときに気を付けなければなりません: print 1+2+3; # 6 と出力 print(1+2) + 3; # 3 と出力 print (1+2)+3; # これも 3! print +(1+2)+3; # 6 と出力 print ((1+2)+3); # 6 と出力 Perl に -w スイッチを付けて実行すれば、こういったものには警 告を出してくれます。 たとえば、上記の 3 つめは: print (...) interpreted as function at - line 1. Useless use of integer addition in void context at - line 1. となります。 スカラコンテキストでも、リストコンテキストでも 使える関数は、致命的でないエラーを示すために、スカラコンテキ ストでは未定義値を返し、リストコンテキストでは空リストを返し ます。 Perl manpages Last change: Release 5.0 Patchlevel 00 1 PERLFUNC(1) USER COMMANDS PERLFUNC(1) 以下の規則を覚えておいてください: + 「リストをスカラに変換するための、一般的な規則はない」 それぞれの演算子や関数について、スカラコンテキストにおいて、 どんな値を返すのが望ましいかを吟味しています。 ある種の演算 子では、リストコンテキストであったなら、返すはずのリストの長 さを返すようにしています。 いくつの演算子は、リストの最初の 値を返します。 また、別の演算子は、演算がうまくいった数を返 すようにしています。 一般に、一貫性さえ望まなければ、やりた いことが、できるようになっています。 -X FILEHANDLE -X EXPR -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 にオープンされている Perl manpages Last change: Release 5.0 Patchlevel 00 2 PERLFUNC(1) USER COMMANDS PERLFUNC(1) -u ファイルの setuid ビットがセットされている -g ファイルの setgid ビットがセットされている -k ファイルの sticky ビットがセットされている -T ファイルはテキストファイル -B ファイルはバイナリファイル (-T の反対) -M スクリプト実行開始時のファイル修正からの日数 -A 同様にアクセスがあってからの日数 -C 同様に inode が変更されてからの日数 があります。 ファイルのパーミッション演算子 -r, -R, -w, -W, -x, -X の解釈は、ファイルのモードとユーザの実効/実 uid と実効/実 gid のみから判断されます。 実際にファイ ルが読めたり、書けたり、実行できたりするためには、 別の条件が必要かもしれません。 スーパーユーザには、 -r, -R, -w, -W に対して、常に 1 が返り、モード中のい ずれかの実行許可ビットが立っていれば、-x, -X にも 1 が返ることにも注意してください。 スーパーユーザが実 行するスクリプトでは、ファイルのモードを調べるために は、stat() を行なうか、uid を一時的に別のものにする 必要があるでしょう。 例: while (<>) { chop; next unless -f $_; # 通常ファイル以外はスキップ ... } -s/a/b は、置換演算 (s///) の符号反転ではありません。 しかし、-exp($foo) は期待どおりに動作します。 マイ ナス記号の後に英字が 1 字続くときにのみ、ファイルテ ストと解釈されます。 ファイルテスト -T と -B の動作原理は、次のようになっ ています。 ファイルの最初の数ブロックを調べて、変わ った制御コードや上位ビットがセットされているような、 通常のテキストには現れない文字を探します。 そのよう な文字が、たくさん (>30%) 見つかるようであれば、その ファイルは -B ファイルであると判断され、それほど見つ からなければ、-T ファイルとなります。 最初のブロッ クにヌル文字が含まれるファイルも、バイナリファイルと みなされます。 -T や -B をファイルハンドルに対して 用いると、最初のブロックを調べる代わりに、標準入出力 バッファを調べます。 調べたファイルの中身が何もない ときや、ファイルハンドルを調べたときに EOF に達して いたときには、-T も -B も「真」を返します。 Perl manpages Last change: Release 5.0 Patchlevel 00 3 PERLFUNC(1) USER COMMANDS PERLFUNC(1) どのファイルテスト (あるいは、stat() や lstat()) 演 算子にも、下線だけから成る特別なファイルハンドルを与 えると、前回のファイルテスト (や stat) の stat 構造 体が使われ、システムコールを省きます。 (-t には使え ませんし、lstat() や -l は実ファイルではなく、シンボ リックリンクの情報を 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 _; abs VALUE 引数の絶対値を返す。 accept NEWSOCKET,GENERICSOCKET accept(2) システムコールと同様に、着信するソケットの 接続を受け付けます。 成功時にはパックされたアドレス を返し、失敗すれば偽を返します。 perlipc manpage の 例を参照してください。 alarm SECONDS 指定した秒数が経過した後に、自プロセスに SIGALRM が 送られてくるようにします。 (マシンによっては、秒の 数え方が異なるため、指定した秒数よりも最大で 1 秒少 ない経過時間となります。) 一度には 1 つのタイマだけ が設定可能です。 呼び出しを行なう度に、以前のタイマ を無効にしますし、新しくタイマを起動しないで以前のタ イマをキャンセルするために引数に 0 を指定して呼び出 すことができます。 以前のタイマの残り時間が、返却値 となります。 1 秒より精度の高いスリープを行なうには、setitimer(2) をサポートしているシステムでは、Perl の syscall() イ ンタフェースを使ってアクセスすることができますし、サ ポートしていなければ、このドキュメントのどこかにある select() の項を参照してください。 atan2 Y,X -πからπの範囲で Y/X の逆正接を返す。 bind SOCKET,NAME bind(2) システムコールと同様に、ネットワークアドレス Perl manpages Last change: Release 5.0 Patchlevel 00 4 PERLFUNC(1) USER COMMANDS PERLFUNC(1) をソケットに結び付けます。 成功時には真を返し、失敗 時には偽を返します。 NAME は、ソケットに対する、適 切な型のパックされたアドレスでなければなりません。 perlipc manpage の例を参照してください。 binmode FILEHANDLE バイナリファイルとテキストファイルを区別する OS にお いて、指定ファイルを「バイナリ」で読み書きするように 指定します。 バイナリモードではないファイルは、入力 時に CR LF の連続が LF に置き換えられ、出力時に LF が CR LF の列に置き換えられます。 binmode は、UNIX では何の影響もなく、DOS では必須かもしれません。 FILEHANDLE が式である場合には、その式の値がファイル ハンドルの名前として使われます。 bless REF,PACKAGE bless REF この関数は、(REF で渡された) 参照されるオブジェクト に対し、PACKAGE 内のオブジェクトとなったことを伝えま す。 通常は PACKAGE が省略され、その場合には、その 時点のパッケージとなります。 bless() は通常、コンス トラクタの最後に置かれますので、簡便のためにそのリフ ァレンスを返します。 オブジェクトの bless (や再 bless) について、詳しくは perlobj manpage を参照して ください。 caller EXPR caller その時点のサブルーティン呼び出しのコンテキストを返し ます。 スカラコンテキストでは、呼び元がある場合 (サ ブルーティン、eval()、require() の中にいるとき) には 真を返し、その他のときには偽を返します。 リストコン テキストでは、 ($package,$filename,$line) = caller; を返します。 EXPR を付けると、デバッガがスタックトレースを表示す るために使う情報を返します。 EXPR の値は、現状から 数えて、いくつ前のコールフレームまで戻るかを示します。 chdir EXPR (可能であれば、) カレントディレクトリを EXPR に移し ます。 EXPR を指定しないと、ホームディレクトリに移 ります。 成功時には真を返し、そうでなければ偽を返し ます。 die() の項の例を参照してください。 chmod LIST LIST に含まれるファイルの、パーミッションを変更しま す。 LIST の最初の要素は、数値表現のモードでなけれ Perl manpages Last change: Release 5.0 Patchlevel 00 5 PERLFUNC(1) USER COMMANDS PERLFUNC(1) ばなりません。 変更に成功したファイルの数を返します。 $cnt = chmod 0755, 'foo', 'bar'; chmod 0755, @executables; chomp VARIABLE chomp LIST chomp 少しばかり安全な chop (以下を参照してください) です。 $/ (English モジュールでは、$INPUT_RECORD_SEPARATOR とも言う) のその時点の値に対応する行末文字を削除しま す。 削除した文字数を返します。 入力レコードから、 改行を削除したいのだけれど、最後のレコードには改行が 入っているのかわからないような場合に、使用することが できます。 段落モード ($/ = "") では、レコードの最 後の改行をすべて取り除きます。 VARIABLE が省略され ると、$_ を対象として chomp します。 例: while (<>) { chomp; # 最後のフィールドの \n を避ける @array = split(/:/); ... } 左辺値であれば、代入を含めて、任意のものを chomp で きます: chomp($cwd = `pwd`); chomp($answer = <STDIN>); リストを chomp すると、個々の要素が chomp され、削除 された文字数の合計が返されます。 chop VARIABLE chop LIST chop 文字列の最後の文字を切り捨てて、その切り取った文字を 返します。 主に、入力レコード末の改行を削除するため に使われますが、文字列の検索もコピーも行ないませんの で s/\n// よりも、ずっと効率的です。 VARIABLE が省 略されると、$_ を対象として chop します。 例: while (<>) { chop; # 最後のフィールドの \n を避ける @array = split(/:/); ... } Perl manpages Last change: Release 5.0 Patchlevel 00 6 PERLFUNC(1) USER COMMANDS PERLFUNC(1) 左辺値であれば、代入を含めて、任意のものを chop でき ます: chop($cwd = `pwd`); chop($answer = <STDIN>); リストを chop すると、個々の要素が chop されます。 最後の chop の値だけが返されます。 chown LIST LIST に含まれるファイルの所有者 (とグループ) を変更 します。 LIST の最初の 2 つの要素には、「数値表現」 の uid と gid をこの順序で与えなければなりません。 変更に成功したファイルの数が返されます。 $cnt = chown $uid, $gid, 'foo', 'bar'; chown $uid, $gid, @filenames; passwd ファイルから数値表現でない uid を検索する例を 示します: print "User: "; chop($user = <STDIN>); print "Files: " chop($pattern = <STDIN>); ($login,$pass,$uid,$gid) = getpwnam($user) or die "$user not in passwd file"; @ary = <${pattern}>; # ファイル名の展開 chown $uid, $gid, @ary; chr NUMBER 特定の文字セットでの NUMBER で表わされる文字を返す。 たとえば、chr(65) は ASCII では "A" となります。 chroot FILENAME 同じ名前のシステムコールと同じことをします。 それが 何をするものかを、知らなくても気にしないでください。 FILENAME を省略すると、$_ へ chroot します。 close FILEHANDLE FILEHANDLE に対応したファイルまたはパイプをクローズ し、標準入出力が正常にバッファのフラッシュを行なって、 ファイル記述子のクローズしたときにのみ「真」を返しま す。 クローズしてすぐにまた、同じファイルハンドルに 対してオープンを行なう場合には、open が自動的に close を行ないますので、close FILEHANDLE する必要はありま せん。 (open() 参照。) ただし、明示的にクローズを 行なったときにのみ入力ファイルの行番号 ($.) のリセッ トが行なわれ、open() によって行なわれる暗黙の close Perl manpages Last change: Release 5.0 Patchlevel 00 7 PERLFUNC(1) USER COMMANDS PERLFUNC(1) では行なわれません。 また、後でパイプの出力を見たい 場合のために、パイプのクローズでは、パイプ上で実行さ れているプロセスの完了を待ちます。 明示的なパイプの クローズはまた、コマンドのステータス値を $? に設定し ます。 例: open(OUTPUT, '|sort >foo'); # sort へのパイプ ... # 出力 close OUTPUT; # sort の完了を待つ open(INPUT, 'foo'); # 結果を入力 FILEHANDLE は、実際のファイルハンドル名を値とする式 でもかまいません。 closedir DIRHANDLE opendir() でオープンしたディレクトリをクローズします。 connect SOCKET,NAME connect(2) システムコールと同様に、リモートソケット への接続を試みます。 成功時には真を返し、失敗時には 偽を返します。 NAME は、ソケットに対する、適切な型 のパックされたアドレスでなければなりません。 perlipc manpage の例を参照してください。 cos EXPR (ラジアンで示した) EXPR の余弦を返します。 EXPR が 省略されたときには、$_ の余弦を取ります。 crypt PLAINTEXT,SALT C ライブラリの crypt(3) 関数と全く同じように、文字列 を暗号化します。 パスワードファイルの中で、あまり良 くないものをチェックするために使うことができます。 公正な人だけが、これを行なうべきです。 プログラムを実行する人が、自分のパスワードを知ってい ることを確認する例です: $pwd = (getpwuid($<))[1]; $salt = substr($pwd, 0, 2); system "stty -echo"; print "Password: "; chop($word = <STDIN>); print "\n"; system "stty echo"; if (crypt($word, $salt) ne $pwd) { die "Sorry...\n"; } else { print "ok\n"; } Perl manpages Last change: Release 5.0 Patchlevel 00 8 PERLFUNC(1) USER COMMANDS PERLFUNC(1) もちろん、聞かれれば、誰にでもパスワードを打ってあげ るなんてのは、もってのほかです。 dbmclose ASSOC_ARRAY [この関数は、untie() 関数にとって代わられました。] DBM ファイルと連想配列の連結をはずします。 dbmopen ASSOC,DBNAME,MODE [この関数は、tie() 関数にとって代わられました。] dbm(3) ファイルまたは ndbm(3) ファイルを連想配列に結 び付けます。 ASSOC は、その連想配列の名前です。 (普通の open とは違って、最初の引数はファイルハンド ルではありません。 まあ、似たようなものですが。) DBNAME は、データベースの名前です (拡張子の .dir や .pag はつけません)。 データベースが存在しなければ、 MODE (を umask() で修正したもの) で指定されたモード で作られます。 古い DBM 関数のみをサポートしている システムでは、プログラム中で 1 度だけ dbmopen() を実 行することができます。 DBM も ndbm も持っていないシ ステムでは、dbmopen() を呼び出すと致命的エラーになり ます。 DBM ファイルに対して、書き込み権が無いときには、連想 配列を読みだすことだけができ、設定することはできませ ん。 書けるか否かを調べたい場合には、ファイルテスト 演算子を使うか、エラーをトラップしてくれる、eval() の中で、ダミーのエントリを設定してみることになります。 大きな DBM ファイルを扱うときには、keys() や values() のような関数は、巨大は配列を返します。 大きな DBM ファイルでは、each() 関数を使って繰り返しを行なった 方が良いかもしれません。 例: # history ファイルのオフセットを印字 dbmopen(%HIST,'/usr/lib/news/history',0666); while (($key,$val) = each %HIST) { print $key, ' = ', unpack('L',$val), "\n"; } dbmclose(%HIST); defined EXPR 左辺値 EXPR が実際に値を持つか否かを示す、ブール値を 返します。 多くの演算子が、EOF や未初期化変数、シス テムエラーといった、例外的な条件で未定義値を返すよう になっています。 この関数は、配列の要素の参照のよう に、実際にヌル文字列を返す演算について、未定義のヌル スカラと、定義済みのヌルスカラを区別するときに使いま す。 配列やサブルーティンの存在を、確かめることもで きます。 あらかじめ定義された予約変数に対して用いて も、直感的に想像できるような値を返すことは保証されて いません。 Perl manpages Last change: Release 5.0 Patchlevel 00 9 PERLFUNC(1) USER COMMANDS PERLFUNC(1) ハッシュの要素に対して用いると、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); eval '@foo = ()' if defined(@foo); die "No XYZ package defined" unless defined %_XYZ; sub foo { defined &$bar ? &$bar(@_) : die "No bar"; } undef() も参照してください。 delete EXPR ハッシュ配列から指定された value を削除します。 削 除された値か、(何も削除されなかった場合には) 未定義 値が返されます。 $ENV{} から削除を行なうと、実際に 環境変数を変更します。 DBM ファイルに tie された配 列からの削除は、その DBM ファイルからエントリを削除 します。 (しかし、tie されたハッシュからの削除が、 値を返すとは限りません。) 以下は、連想配列のすべての value を削除します: foreach $key (keys %ARRAY) { delete $ARRAY{$key}; } (ただし、undef() コマンドを使った方が速いでしょう。) 最終的な操作がハッシュの key による検索である限りは、 EXPR には任意の複雑な式を置くことができます: delete $ref->[$x][$y]{$key}; die LIST eval() の外では、LIST の値を STDERR に出力し、その時 点の $! (errno) の値で exit します。 $! の値が 0 な らば、($? >> 8) (`command` のステータス) の値で exit します。 ($? >> 8) も 0 であれば、255 で exit する ことになります。 eval() の中で使用すると、エラーメ ッセージが、$@ に入れられます。 eval() は中断され、 未定義値を返します。 同値な例: die "Can't cd to spool: $!\n" unless chdir '/usr/spool/news'; chdir '/usr/spool/news' or die "Can't cd to spool: $!\n" Perl manpages Last change: Release 5.0 Patchlevel 00 10 PERLFUNC(1) USER COMMANDS PERLFUNC(1) LIST の評価結果が改行で終わっていなければ、その時点 のスクリプト名とスクリプトの行番号、(もしあれば) 入 力ファイルの行番号と改行文字が、続けて表示されます。 ヒント: メッセージの最後を ", 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() も参照 してください。 do BLOCK 実際は関数ではありません。 BLOCK で示されるコマンド 列の最後の値を返します。 ループ修飾子で修飾すると、 ループ条件を調べる前に 1 度、BLOCK を実行します。 (これ以外の実行文は、ループ修飾子により、条件が最初 に調べられます。) do SUBROUTINE(LIST) 望ましくないサブルーティン呼び出しの形式。 perlsub manpage を参照してください。 do EXPR EXPR の値をファイル名として用い、そのファイルの中身 を Perl のスクリプトとして実行します。 主に、Perl のサブルーティンライブラリからサブルーティンをインク ルードするために用います。 do 'stat.pl'; は、 eval `cat stat.pl`; と同じようなものですが、より効率的で、簡潔であり、エ ラーメッセージでファイル名がわかる、カレントディレク トリでファイルが見つからなかったときに、-I 示すすべ てのディレクトリを探す、といったことがあります (perlvar manpage の「定義済み名」にある @INC 配列も 参照してください)。 しかし、呼び出すたびにファイル を解析し直すという点では同じですから、ループ内でこれ を使おうなどとは、間違っても思ったりしないように。 ライブラリモジュールのインクルードには、use() 演算子 Perl manpages Last change: Release 5.0 Patchlevel 00 11 PERLFUNC(1) USER COMMANDS PERLFUNC(1) や require() 演算子を使った方が良いでしょう。 dump LABEL 即座にコアダンプを行ないます。 プログラムの先頭で、 すべての変数を初期化したあとのコアダンプを undump プ ログラムを使って実行ファイルに返ることができます。 この新しいバイナリが実行されると、goto LABEL から始 めます (goto に関する制限はすべて適用されます)。 コ アダンプをはさんで再生する goto と考えてください。 LABEL が省略されると、プログラムを先頭から再開します。 警告: dump 時点でオープンされていたファイルは、プロ グラムが再生されたときには、もはやオープンされていま せん。 Perl を部分的に混乱させる可能性があります。 perlrun manpage の -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'); each ASSOC_ARRAY 連想配列の次の value に対する、key と value からなる 2 要素の配列を返しますので、連想配列上での繰り返しを 行なうことができます。 エントリは見かけ上、ランダム な順序で返されます。 配列をすべて読み込んでしまうと、 空配列が返されます (これは代入されると、偽 (0) とな ります)。 そのあと、もう一度 each() を呼び出すと、 再び繰り返しを始めます。 反復子は、配列の要素をすべ て読むことによってのみリセットすることができます。 繰り返しを行なっている間に、配列に要素を追加してはな りません。 連想配列ごとに反復子が 1 つあり、プログ ラム中のすべての each() 関数、keys() 関数、values() 関数で共用されます。 以下のプログラムは、順番が異な るものの、printenv(1) プログラムのように環境変数を表 示します: Perl manpages Last change: Release 5.0 Patchlevel 00 12 PERLFUNC(1) USER COMMANDS PERLFUNC(1) while (($key,$value) = each %ENV) { print "$key=$value\n"; } keys() や values() も参照してください。 eof FILEHANDLE eof 次に FILEHANDLE 上で読み込みを行なったときに、 EOF が返されるときか、FILEHANDLE がオープンされていない と、1 を返します。 FILEHANDLE は、値が実際のファイ ルハンドル名を示す式であってもかまいません。 (この 関数は、実際に文字を読み、ungetc() を行ないますので、 対話型の場合には、それ程有用ではありません。) 引数 を省略した eof は、最後に読み込みを行なったファイル の EOF 状態を返します。 空の括弧 () は、コマンドラ インのファイルリストで構成される、擬似ファイルを示す ために用いられます。 つまり eof() は、while (<>) ル ープの中で、最終ファイルの最後を検出するために使えま す。 while (<>) ループの個々のファイルを調べるには、 eof(ARGV) か、括弧なしの eof を用います。 例: # 最後のファイルの最終行の前にダッシュを入れる while (<>) { if (eof()) { print "--------------\n"; } print; } # ファイルごとに行番号をリセットする while (<>) { print "$.\t$_"; if (eof) { # eof() ではない close(ARGV); } } 現実的なヒント: Perl で eof が必要となることは、ほと んどありません。 データがなくなったときに、入力演算 子が未定義値を返してくれるからです。 eval EXPR eval BLOCK EXPR が Perl のプログラムであるかのように、解析し、 実行します。 その時点の Perl プログラムの脈絡の中で 実行されますので、変数の設定、サブルーティンやフォー マットの定義は、その後も残っています。 返される値は、 サブルーティン同様に、最後に評価した式の値か、return 文の値です。 Perl manpages Last change: Release 5.0 Patchlevel 00 13 PERLFUNC(1) USER COMMANDS PERLFUNC(1) 構文エラーや実行エラーが発生するか、die() 文が実行さ れると、eval() の値として未定義値が返され、$@ にエラ ーメッセージが設定されます。 エラーがなければ、$@ は、空文字列であることが保証されます。 EXPR を省略 すると、$_ を評価します。 最後のセミコロンは、式か ら省くことができます。 eval() は、致命的エラーとなるようなものをトラップす ることができますから、(dbmopen() や symlink() といっ た) 特定の機能がインプリメントされているかを、調べる ために使うことができます。 die 演算子が例外を発生さ せるものとすれば、これはまた、Perl の例外捕捉機能と 捉えることもできます。 実行するコードが変わらないのであれば、毎回多量の再コ ンパイルすることなしに、実行時エラーのトラップを行な うために、eval-BLOCK 形式を使うことができます。 エ ラーがあれば、やはり $@ に返されます。 例: # 0 除算を致命的でなくす eval { $answer = $a / $b; }; warn $@ if $@; # 効率的ではないが、同じ eval '$answer = $a / $b'; warn $@ if $@; # コンパイル時エラー eval { $answer = }; # 実行時エラー eval '$answer ='; # $@ を設定 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」というコ ードを実行します。 (純粋に見た目の問題で、CASE 4 が 好まれます。) CASE 5 の場合は、通常ダブルクォートを 使用します。 この状況を除けば、CASE 6 のように、単 にシンボリックリファレンスを使えば良いでしょう。 Perl manpages Last change: Release 5.0 Patchlevel 00 14 PERLFUNC(1) USER COMMANDS PERLFUNC(1) exec LIST exec() 関数は、システムのコマンドを実行し、戻っては きません。 戻って欲しい場合には、system() 関数を使 ってください。 LIST に複数の引数がある場合か、LIST が複数の値を持つ 配列の場合には、LIST の引数を使って、execvp(3) を呼 び出します。 1 つのスカラ引数のみの場合には、その引 数からシェルのメタ文字をチェックします。 もし、メタ 文字があれば、引数全体を /bin/sh -c に渡して解析させ ます。 もし、なければ、その引数を単語に分け、より効 率的な execvp() に直接、渡します。 注: exec() (と system())は出力バッファをフラッシュしませんので、 出力をなくしたくなければ、$| を設定する必要があるか もしれません。 例: exec '/bin/echo', 'Your arguments are: ', @ARGV; exec "sort $outfile | uniq"; 第一引数に指定するものを本当に実行したいが、実行する プログラムに対して別の名前を教えたい場合には、LIST の前に、「間接オブジェクト」(コンマなし) として、実 際に実行したいプログラムを指定することができます。 (これによって、LIST に単一のスカラしかなくても、複数 値のリストであるように、LIST の解釈を行ないます。) 例: $shell = '/bin/csh'; exec $shell '-sh'; # login シェルの振りをする あるいは、より直接的に、 exec {'/bin/csh'} '-sh'; # login シェルの振りをする exists EXPR 指定されたハッシュ key が、ハッシュ配列に存在すれば、 たとえ対応する value が未定義でも「真」を返します。 print "Exists\n" if exists $array{$key}; print "Defined\n" if defined $array{$key}; print "True\n" if $array{$key}; ハッシュ要素は、定義されているときにのみ真となり、存 在しているときにのみ定義されますが、逆は必ずしも真で はありません。 最終的な操作がハッシュの key による検索である限りは、 EXPR には任意の複雑な式を置くことができます: if (exists $ref->[$x][$y]{$key}) { ... } Perl manpages Last change: Release 5.0 Patchlevel 00 15 PERLFUNC(1) USER COMMANDS PERLFUNC(1) exit EXPR EXPR を評価し、即座にその値を持って終了します。 (実 際には、まず、定義されている END ルーティンを呼び出 しますが、END ルーティンは exit を止められません。 同様に、呼び出す必要のあるオブジェクトデストラクタは すべて、exit の前に呼び出されます。) 例: $ans = <STDIN>; exit 0 if $ans =~ /^[Xx]/; die() も参照してください。 EXPR が省略された場合に は、ステータスを 0 として終了します。 exp EXPR e (自然対数の底) の EXPR 乗を返す。 EXPR を省略した 場合には、exp($_) を返す。 fcntl FILEHANDLE,FUNCTION,SCALAR fcntl(2) 関数をインプリメントします。 正しい関数定 義を得るために、まず、 use Fcntl; と書くことが必要でしょう。 引数の処理と返却値につい ては、下記の ioctl() と同様に動作します。 fcntl(2) がインプリメントされていないマシンでは、fcntl() は致 命的エラーを引き起こします。 使用例: use Fcntl; fcntl($filehandle, F_GETLK, $packed_return_buffer); fileno FILEHANDLE ファイルハンドルに対するファイル記述子を返します。 select() に対する、ビットマップを構成するときに便利 です。 FILEHANDLE が式であれば、その値がファイルハ ンドルの名前として使われます。 flock FILEHANDLE,OPERATION FILEHANDLE に対して flock(2) を呼び出します。 OPERATION の記述については、flock(2) manpage を参照 してください。 成功時には真を、失敗時には偽を返しま す。 flock(2) がインプリメントされていないマシンで の実行は、致命的エラーとなります。 BSD システムでの メールボックスへの追加処理の例を示します。 $LOCK_SH = 1; $LOCK_EX = 2; $LOCK_NB = 4; $LOCK_UN = 8; Perl manpages Last change: Release 5.0 Patchlevel 00 16 PERLFUNC(1) USER COMMANDS PERLFUNC(1) sub lock { flock(MBOX,$LOCK_EX); # さらに、待っている間に書き足した # 人がいるといけないので ... 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() ではネットワークをまたがって、ロックは行なえ ません。 このためには、fcntl() を使ってロックしなく てはなりません。 fork システムコール fork(2) を行ないます。 親プロセスに は、チャイルドプロセスの pid を、チャイルドプロセス に 0 を返しますが、fork に失敗したときには、未定義値 を返します。 注: フラッシュされていないバッファは、 どちらのプロセスに対しても、フラッシュされていないま まとなっています。 これは、出力がダブルのを避けるた めには、$| (English では $AUTOFLUSH) を設定するか、 ファイルハンドルメソッド autoflush() を呼ぶ必要があ るかもしれないということです。 チャイルドプロセスの終了を待たずに、fork() を繰り返 せば、ゾンビをため込むことになります: $SIG{'CHLD'} = sub { wait }; ダブル fork という仕掛けも使えます (fork の返却値の エラーチェックは省いています); unless ($pid = fork) { unless (fork) { exec "what you really wanna do"; die "no exec"; # ... または ... some_perl_code_here; exit 0; } exit 0; } waitpid($pid,0); Perl manpages Last change: Release 5.0 Patchlevel 00 17 PERLFUNC(1) USER COMMANDS PERLFUNC(1) formline PICTURE, LIST これは、format が使用する内部関数ですが、直接呼び出 すこともできます。 これは、PICTURE の内容にしたがっ て、LIST の値を整形し (perlform manpage を参照してく ださい)、結果をフォーマット出力アキュムレータ $^A に 納めます。 最終的に、write() がなされると、$^A の中 身が、何らかのファイルハンドルに書き出されますが、自 分で $^A を読んで、$^A の内容を "" に戻してもかまい ません。 format は通常、1 行ごとに formline() を行 ないますが、formline() 関数自身は、PICTURE の中にい くつの改行が入っているかは、関係がありません。 ダブ ルクォートで PICTURE を囲む場合には、"@" という文字が 配列名の始まりと解釈されますので、注意してください。 formline() は常に「真」を返します。 getc FILEHANDLE getc FILEHANDLE につながれている入力ファイルから、次の一 文字を返します。 EOF では、空文字列を返します。 FILEHANDLE が省略された場合には、STDIN から読み込み を行ないます。 getlogin もしあれば、/etc/utmp から現在のログイン名を返します。 ヌルであれば、getpwuid() を使ってください。 $login = getlogin || (getpwuid($<))[0] || "Kilroy"; getpeername SOCKET SOCKET コネクションの向こう側のパックされた aockaddr アドレスを返します。 # インターネットの sockaddr $sockaddr = 'S n a4 x8'; $hersockaddr = getpeername(S); ($family, $port, $heraddr) = unpack($sockaddr,$hersockaddr); getpgrp PID getpgrp 指定された PID の現在のプロセスグループを返します。 PID に 0 を与えるとカレントプロセスの指定となります。 getpgrp(2) をインプリメントしていないマシンで実行し た場合には、致命的エラーとなります。 PID を省略する とカレントプロセスのプロセスグループを返します。 getppid 親プロセスのプロセス id を返します。 getpriority WHICH,WHO プロセス、プロセスグループ、ユーザに対する現在の優先 度を返します。 (getpriority(2) manpage を参照してく Perl manpages Last change: Release 5.0 Patchlevel 00 18 PERLFUNC(1) USER COMMANDS PERLFUNC(1) ださい。) 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 Perl manpages Last change: Release 5.0 Patchlevel 00 19 PERLFUNC(1) USER COMMANDS PERLFUNC(1) endgrent endhostent endnetent endprotoent endservent これらのルーティンは、システムライブラリの同名の関数 を実行します。 リストコンテキストでは、さまざまな get ルーティンからの返却値は、次のようになります: ($name,$passwd,$uid,$gid, $quota,$comment,$gcos,$dir,$shell) = 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* (エントリが存在しなければ、空リストが返されます。) スカラコンテキストでは、*nam、*byname といった NAME で検索するもの以外は、name を返し、NAME で検索するも のは、何か別のものを返します。 (エントリが存在しな ければ、未定義値が返ります。) たとえば: $uid = getpwnam $name = getpwuid $name = getpwent $gid = getgrnam $name = getgrgid $name = getgrent etc. getgr*() によって返る値 $members は、グループのメン バのログイン名をスペースで区切ったものです。 gethost*() 関数では、C で h_errno 変数がサポートされ ていれば、関数呼出が失敗したときに、$? を通して、そ の値が返されます。 成功時に返される @addrs 値は、対 応するシステムコールが返す、生のアドレスのリストです。 インターネットドメインでは、個々のアドレスは、4 バイ ト長で、 ($a,$b,$c,$d) = unpack('C4',$addr[0]); のようにして、unpack することができます。 Perl manpages Last change: Release 5.0 Patchlevel 00 20 PERLFUNC(1) USER COMMANDS PERLFUNC(1) getsockname SOCKET SOCKET コネクションのこちら側のパックされた aockaddr アドレスを返します。 # インターネット sockaddr $sockaddr = 'S n a4 x8'; $mysockaddr = getsockname(S); ($family, $port, $myaddr) = unpack($sockaddr,$mysockaddr); getsockopt SOCKET,LEVEL,OPTNAME 要求されたソケットオプションを返します。 エラーの場 合には、未定義値を返します。 glob EXPR EXPR の値を、シェルが行なうように、ファイル名の展開 を行なって返します。 これは、<*.*> 演算子をインプリ メントする内部関数です。 gmtime EXPR time 関数が返す時刻を、グリニッジタイムゾーンで測っ た時刻として、9 要素の配列に変換します。 通常は、 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); のようにして使用します。 すべての配列要素は数値で、tm 構造体から直接持ってき ます。 これは特に、$mon が 0..11 の範囲で、$wday が 0..6 の範囲となるということです。 EXPR が省略される と、gmtime(time()) を行ないます。 goto LABEL goto &NAME goto LABEL の形式は、LABEL というラベルの付いた文を 探して、そこへ実行を移すものです。 サブルーティンや foreach ループなど、何らかの初期化が必要な構造の中に 入り込むことは許されません。 最適化によってなくなっ てしまう構造の中にも goto することはできません。 こ れ以外は、サブルーティンの外を含む、動的スコープ内の ほとんどすべての場所へ行くために使用できますが、普通 は、last や die といった別の構造を使った方が良いでし ょう。 Perl の作者はこの形式の goto を使う必要を感 じたことは、1 度もありません (Perl では。C は別のお 話です)。 goto &NAME の形式は、かなりマジカルなもので、現在実 行中のサブルーティンを、NAME で指定されたサブルーテ Perl manpages Last change: Release 5.0 Patchlevel 00 21 PERLFUNC(1) USER COMMANDS PERLFUNC(1) ィンの呼び出しで置き換えます。 これは、AUTOLOAD サ ブルーティンが別のサブルーティンをロードして、その別 のサブルーティンが最初に呼ばれたようにするために使わ れます (ただし、現在のサブルーティンで @_ を修正した 場合には、そのその別のサブルーティンに伝えられます)。 goto のあとは、caller() でさえも、現在のサブルーティ ンが最初に呼び出されたと言うことができません。 grep BLOCK LIST grep EXPR,LIST LIST の個々の要素に対して、BLOCK か EXPR を評価し ($_ は、ローカルに個々の要素が設定されます) 、その要 素のうち、評価した式が真となったものからなるリスト値 が返されます。 スカラコンテキストでは、式が真となっ た回数を返します。 例: @foo = grep(!/^#/, @bar); # コメント行の除去 は @foo = grep {!/^#/} @bar; # コメント行の除去 は、同じことをします。 $_ は、LIST の値へのリファレンスですので、配列の要素 を変更するために使うことができます。 これは、便利で サポートされていますが、LIST が名前の付いた配列でな いと、悲惨な結果になります。 hex EXPR EXPR を 16 進数の文字列と解釈して、10 進数の値を返し ます。 (0 や 0x で始まる文字列の解釈には、oct() を 参照してください。) EXPR が省略されると、$_ を使用 します。 import 組み込みの import() 関数というものはありません。 こ れは単に、別のモジュールに名前をエクスポートしたいモ ジュールが定義した、通常のメソッドサブルーティンです。 use() 関数は、使用されるパッケージのために、import() メソッドを呼び出します。 このドキュメントの use の 項と perlmod manpage を参照してください。 index STR,SUBSTR,POSITION index STR,SUBSTR STR の中の POSITION の位置以降で、最初に SUBSTR が見 つかった位置を返します。 POSITION が省略された場合 には、STR の最初から探し始めます。 返却値のベースは、 0 もしくは、変数 $[ に設定した値です。 SURSTR が見 つからなかった場合には、ベースよりも 1 小さい値、通 常は -1 が返されます。 Perl manpages Last change: Release 5.0 Patchlevel 00 22 PERLFUNC(1) USER COMMANDS PERLFUNC(1) int EXPR EXPR の整数部を返します。 EXPR を省略すると、$_ を 使います。 ioctl FILEHANDLE,FUNCTION,SCALAR ioctl(2) 関数をインプリメントします。 正しい関数の 定義を得るために、おそらく最初に require "ioctl.ph"; # たぶん /usr/local/lib/perl/ioctl.ph としなくてはならないでしょう。 ioctl.h がないか、間 違った定義をしている場合には、<sys/ioctl.ph> のよう な C のヘッダファイルをもとに、自分で作らなければな りません。 (これを手助けしてくれる、h2ph という Perl スクリプトが Perl の配布キットに入っています。) FOUNCTION に応じて SCALAR が読み書きされます。 SCALAR の文字列値へのポインタが、実際の ioctl コール の 3 番目の引数として渡されます。 (SCALAR が文字列 値を持っておらず、数値を持っている場合には、文字列値 へのポインタの代わりに、その値が渡されます。 このこ とを保証するためには、使用する前に SCALAR に 0 を足 してください。) ioctl() で使われる構造体の値を操作 するには、pack() 関数と unpack() 関数が便利です。 以下の例は、1 文字削除の文字として DEL を指定します。 require 'ioctl.ph'; $sgttyb_t = "ccccs"; # 4 つの char と 1 つの short if (ioctl(STDIN,$TIOCGETP,$sgttyb)) { @ary = unpack($sgttyb_t,$sgttyb); $ary[2] = 127; $sgttyb = pack($sgttyb_t,@ary); ioctl(STDIN,$TIOCSETP,$sgttyb) || die "Can't ioctl: $!"; } ioctl (と fcntl) の返却値は、 OS からの返却値 | Perl の返却値 -------------------+----------------------------- -1 | 未定義値 0 | "0 but true" という文字列 その他 | OS からの返却値 のようになっています。 つまり Perl は、成功時に「真」、失敗時に「偽」を返す ことになり、OS が実際に返した値も、 ($retval = ioctl(...)) || ($retval = -1); printf "System returned %d\n", $retval; のように簡単に知ることができます。 Perl manpages Last change: Release 5.0 Patchlevel 00 23 PERLFUNC(1) USER COMMANDS PERLFUNC(1) join EXPR,LIST LIST や ARRAY の個別の文字列を、EXPR の値で区切って 1 つの文字列につなげ、その文字列を返します。 例: $_ = join(':', $login,$passwd,$uid,$gid,$gcos,$home,$shell); この perlfunc manpage の split の項も参照してくださ い。 keys ASSOC_ARRAY 指定した連想配列のすべての key からなる、通常配列を 返します。 (スカラコンテキストでは、key の数を返し ます。) 返される key の順序は、見た目にばらばらなも のですが (連想配列に変更がなければ)、values() 関数や each() 関数で返されるものと同じ順序です。 環境変数 を表示する別の例です: @keys = keys %ENV; @values = values %ENV; while ($#keys >= 0) { print pop(@keys), '=', pop(@values), "\n"; } key をソートしてもいいでしょう: foreach $key (sort(keys %ENV)) { print $key, '=', $ENV{$key}, "\n"; } kill LIST プロセスのリストにシグナルを送ります。 LIST の最初 の要素は、送信するシグナルでなくてはなりません。 シ グナル送信に成功したプロセスの数を返します。 $cnt = kill 1, $child1, $child2; kill 9, @goners; シェルとは異なり、Perl では、シグナルに負の数を与え ると、プロセスではなく、プロセスグループに対して、 kill を行ないます。 (Syetem V では、プロセス番号と して負の値を与えても、プロセスグループの kill を行な いますが、移植性がありません。) すなわち、通常は、 負のシグナルは用いず、正のシグナルを使うことになりま す。 シグナル名をクォートして使うこともできます。 last LABEL last last コマンドは、(ループ内で使った) C の break 文と 同じようなもので、LABEL で指定されるループを即座に抜 けます。 LABEL が省略されると、一番内側のループが対 象となります。 continue ブロックがあっても実行され Perl manpages Last change: Release 5.0 Patchlevel 00 24 PERLFUNC(1) USER COMMANDS PERLFUNC(1) ません: LINE: while (<STDIN>) { last LINE if /^$/; # ヘッダが終わったら抜ける ... } lc EXPR EXPR を小文字に変換したものを返します。 これは、ダ ブルクォート文字列における、\L エスケープをインプリ メントする内部関数です。 lcfirst EXPR 最初の文字だけを小文字にした、EXPR を返します。 こ れは、ダブルクォート文字列における、\l エスケープを インプリメントする内部関数です。 length EXPR EXPR の値の文字列長を返します。 EXPR が省略されたと きには、$_ の長さを返します。 link OLDFILE,NEWFILE OLDFILE にリンクされた、新しいファイル NEWFILE を作 ります。 成功時には 1 を、失敗時には 0 を返します。 listen SOCKET,QUEUESIZE listen(2) システムコールと同じことをします。 成功時 には真を返し、失敗時には偽を返します。 perlipc manpage の例を参照してください。 local EXPR 一般には、"local" よりも "my" を使うべきでしょう。 速く、安全だからです。 しかし、format 文の変数には、 "local" やローカルな値が呼び出されたサブルーティンか ら見えるような変数を使わなければなりません。 これは、 動的スコープと呼ばれます。 文面上の静的なスコープは、 "my" を使って得られ、C の AUTO 宣言と同じように働き ます。 "local" はリストアップされた変数を、囲っているブロッ クやサブルーティン、eval や do の中で、ローカルなも のにします。 複数の値を並べる場合には、括弧で括る必 要があります。 並べる要素は、左辺値として使用できる ものでなければなりません。 この演算子は LIST 中の、 それらの変数の現在の値を隠れたスタックに保存し、ブロ ックやサブルーティンや eval から抜けるときに、それら の値を戻します。 これによって、呼ばれたサブルーティ ンはグローバルな変数ではなく、ローカルな変数を参照す ることができます。 EXPR に代入を行なうことも可能で、 ローカルな変数の初期化として使うことができます。 (初期化子を与えなかった変数の値は、未定義値となりま す。) これはよく、サブルーティンの引数に名前を付け Perl manpages Last change: Release 5.0 Patchlevel 00 25 PERLFUNC(1) USER COMMANDS PERLFUNC(1) るのに使われます。 例: 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>; では、スカラコンテキストになります。 Perl manpages Last change: Release 5.0 Patchlevel 00 26 PERLFUNC(1) USER COMMANDS PERLFUNC(1) localtime EXPR time 関数が返す時刻を、ローカルなタイムゾーンで測っ た時刻として、9 要素の配列に変換します。 通常は、 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); のようにして使用します。 すべての配列要素は数値で、tm 構造体から直接持ってき ます。 これは特に、$mon が 0..11 の範囲で、$wday が 0..6 の範囲となるということです。 EXPR が省略される と、localtime(time()) を行ないます。 スカラコンテキストでは、ctime(3) の値を返します: $now_string = localtime; # 例 "Thu Oct 13 04:54:34 1994" perlmod manpage の timelocal の項や POSIX モジュール によって使用できる strftime(3) 関数も参照してくださ い。 (訳注: と書いてあるが、perlmod に timelocal は ない。) log EXPR EXPR の (e を底とする) 対数を返します。 EXPR が省略 されると、$_ の対数を返します。 lstat FILEHANDLE lstat EXPR stat() 関数と同じことをするが、シンボリックリンクが 指しているファイルではなく、シンボリック自体の stat をとります。 シンボリックリンクがシステムにインプリ メントされていないと、通常の stat() が行なわれます。 m// マッチ演算子。 perlop manpage を参照してください。 map BLOCK LIST map EXPR,LIST LIST の個々の要素に対して、BLOCK か EXPR を評価し ($_ は、ローカルに個々の要素が設定されます) 、それぞ れの評価結果からなるリスト値が返されます。 BLOCK や EXPR をリストコンテキストで評価しますので、LIST の 個々の要素によって作られる、返却値であるリストの要素 数は、0 個の場合もあれば、複数の場合もあります。 @chars = map(chr, @nums); は、数のリストを対応する文字に変換します。 また、 %hash = map {&key($_), $_} @array; Perl manpages Last change: Release 5.0 Patchlevel 00 27 PERLFUNC(1) USER COMMANDS PERLFUNC(1) は、 %hash = (); foreach $_ (@array) { $hash{&key($_)} = $_; } をちょっと変わった書き方で書いたものです。 mkdir FILENAME,MODE FILENAME で指定したディレクトリを、MODE で指定した許 可モード (を umask で修正したもの) で作成します。 成功時には 1 を返し、失敗時には 0 を返して $! (errno) を設定します。 msgctl ID,CMD,ARG System V IPC 関数 msgctl を呼び出します。 CMD が &IPC_STAT であれば、ARG は返される msqid_ds 構造体を 納める変数でなければなりません。 ioctl と同じように、 エラー時には未定義値、ゼロのときは "0 but true"、そ れ以外なら、その値そのものを返します。 msgget KEY,FLAGS System V IPC 関数 msgget を呼び出します。 メッセー ジキューの ID か、エラー時には未定義値を返します。 msgrcv ID,VAR,SIZE,TYPE,FLAGS System V IPC 関数 msgrcv を呼び出し、メッセージキュ ー ID から、変数 VAR に最大メッセージ長 SIZE のメッ セージを受信します。 メッセージが受信されたならば、 VAR の先頭がメッセージタイプとなり、VAR の最大長は、 SIZE にこのメッセージタイプの長さを加えたものになり ます。 成功時には真を返し、エラー時には偽を返します。 msgsnd ID,MSG,FLAGS System V IPC 関数 msgsnd を呼び出し、メッセージキュ ー ID にメッセージ MSG を送信します。 MSG の先頭は、 long 整数のメッセージタイプでなければならず、これは、 pack("L", $type) として生成できます。 成功時には真 を、エラー時には偽を返します。 my EXPR "my" はリストアップされた変数を、囲っているブロック やサブルーティン、eval や do の中で (文面上の意味で) ローカルなものにします。 複数の値を並べる場合には、 括弧で括る必要があります。 並べる要素は、左辺値とし て使用できるものでなければなりません。 英数字の識別 子だけが、文面上の字句スコープに入れることができます。 $/ のような、マジカルな組み込み変数をローカル化する には、local を使う必要があります。 特に、 my $_; # 不正 Perl manpages Last change: Release 5.0 Patchlevel 00 28 PERLFUNC(1) USER COMMANDS PERLFUNC(1) とはできません。 "local" の宣言とは違って、"my" で宣言した変数は、呼 び出したサブルーティンを含む、外界からは完全に見えな いものになります (たとえ、それが同一のサブルーティン であってもです。 呼出ごとに新しいものになります)。 (しかし、eval() を使えば、その eval() 自身の中で宣言 によって、名前が見えないようになっているのでない限り、 評価が行なわれる字句スコープの変数を見ることができま す。) perlref manpage を参照してください。 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>; では、スカラコンテキストになります。 Perl manpages Last change: Release 5.0 Patchlevel 00 29 PERLFUNC(1) USER COMMANDS PERLFUNC(1) なるべく、字句スコープの変数を使うようにすることもあ るでしょう。 暗黙のうちに、パッケージ変数を参照して しまうのを検出するために、 use strict 'vars'; とすれば、その場所から囲っているブロックの最後までは、 字句変数か、パッケージ名で完全に修飾した変数でなけれ ば、参照できないように制限できます。 それ以外の変数 参照は、コンパイルエラーとなります。 内側のブロック で、no strict 'vars' として、これを打ち消すことがで きます。 next LABEL next next コマンドは、C での continue 文のようなもので、 ループの次の繰り返しを開始します: LINE: while (<STDIN>) { next LINE if /^#/; # コメントを捨てる ... } continue ブロックが存在すれば、たとえ捨てられる行に あっても、それが実行されます。 LABEL が省略されると、 このコマンドは、もっとも内側のループを参照します。 no Module LIST "use" 関数を参照してください。 "no" は、その逆を行な うものです。 oct EXPR EXPR を 8 進数文字列と解釈して、10 進数の値を返しま す。 (EXPR が 0x で始まるときには、16 進数文字列と 解釈します。) 以下の例は、標準的な Perl や C の記法 での 10 進数、8 進数、16 進数を扱います: $val = oct($val) if $val =~ /^0/; EXPR を省略すると、$_ を使用します。 open FILEHANDLE,EXPR open FILEHANDLE EXPR でファイル名を指定するファイルをオープンして、 FILEHANDLE に対応させます。 FILEHANDLE が式のときに は、その値が実際に使用するファイルハンドルの名前とし て使われます。 EXPR を省略すると、FILEHANDLE と同じ 名前のスカラ変数に、ファイル名が入れられているものと して処理されます。 ファイル名の先頭に "<" を付ける か、何も付けなかった場合には、入力用としてオープンさ れることになります。 先頭に ">" を付けると、ファイ Perl manpages Last change: Release 5.0 Patchlevel 00 30 PERLFUNC(1) USER COMMANDS PERLFUNC(1) ルは出力用にオープンされます。 同じように ">>" を付 けるとアペンド用にオープンされます。 (">" や "<" の 前に "+" を置くことで、ファイルを読み書き両用にする こともできます。) ファイル名の先頭に "|" を付けると、 そのファイル名をコマンドとして解釈し、ファイルハンド ルへの出力がパイプを通じて、そのコマンドへ入力されま す。 逆にファイル名の最後に "|" を付けた場合には、 同様にファイル名をコマンドと解釈し、そのコマンドの出 力がパイプを通じて、ファイルハンドルから入力として読 み込むことができるようになります。 (入出力両用にパ イプするコマンドは使えません。訳注: ただし、Perl モ ジュール IPC::Open2 や IPC::Open3 が使えます。) "-" を open すると STDIN がオープンされ、">-" を open す ると STDOUT がオープンされます。 open は、成功時に は、ゼロ以外を返し、失敗時には未定義値を返します。 パイプに関る open のときには、返却値はサブプロセスの pid となります。 例: $ARTICLE = 100; open ARTICLE or die "Can't find article $ARTICLE: $!\n"; while (<ARTICLE>) {... open(LOG, '>>/usr/spool/news/twitlog'); # (log は予約語) open(article, "caesar <$article |"); # 記事の復号 open(extract, "|sort >/tmp/Tmp$$"); # $$ は現 pid # include を使っているファイルのリストを処理する foreach $file (@ARGV) { process($file, 'fh00'); } sub process { local($filename, $input) = @_; $input++; # マジカルインクリメント unless (open($input, $filename)) { print STDERR "Can't open $filename: $!\n"; return; } while (<$input>) { # 間接ファイルハンドル if (/^#include "(.*)"/) { process($1, $input); next; } ... # 好きな処理 } } Bourne シェルの慣例にしたがって、EXPR の先頭に ">&" を付けると、EXPR の残りの文字列をファイルハンドル名 Perl manpages Last change: Release 5.0 Patchlevel 00 31 PERLFUNC(1) USER COMMANDS PERLFUNC(1) (数字であれば、ファイル記述子) と解釈して、それを dup してオープンします。 "&" は、">"、">>"、"<"、"+>"、 "+>>"、"+<" というモード指定に付けることができます。 指定するモード指定は、もとのファイルハンドルのモード と合っていないといけません。 STDOUT と STDERR をい ったん保存し、リダイレクトし、元に戻すスクリプトを示 します。 #!/usr/bin/perl open(SAVEOUT, ">&STDOUT"); open(SAVEERR, ">&STDERR"); open(STDOUT, ">foo.out") || die "Can't redirect stdout"; open(STDERR, ">&STDOUT") || die "Can't dup stdout"; select(STDERR); $| = 1; # バッファリングしない select(STDOUT); $| = 1; # バッファリングしない print STDOUT "stdout 1\n"; # これはサブプロセス print STDERR "stderr 1\n"; # でも働きます close(STDOUT); close(STDERR); open(STDOUT, ">&SAVEOUT"); open(STDERR, ">&SAVEERR"); print STDOUT "stdout 2\n"; print STDERR "stderr 2\n"; N を数値として、"<&=N" と指定すると、Perl は、そのフ ァイル記述子に対する C の fdopen() と同じことを行な います。 たとえば: open(FILEHANDLE, "<&=$fd") "-|" や "|-" というふうに、"-" というコマンドにパイ プをオープンすると、fork が行なわれ、open の返却値と して、親プロセスにはチャイルドプロセスの pid が、チ ャイルドプロセスには 0 が返されます。 (open が成功 したかどうかは、defined($pid) のようにして調べること ができます。) 親プロセスでは、このファイルハンドル は通常通りに動作しますが、行なわれる入出力は、チャイ ルドプロセスの STDIN/STDOUT にパイプされます。 チャ イルドプロセス側では、そのファイルハンドルはオープン されず、入出力は新しい STDOUT か STDIN に対して行な われます。 これは、setuid で実行して、シェルコマン ドのメタ文字を検索させたくないような場合に、パイプコ マンドの起動の仕方を制御したいとき、普通のパイプの open と同じように使います。 以下の組み合わせは、だ いたい同じものです: Perl manpages Last change: Release 5.0 Patchlevel 00 32 PERLFUNC(1) USER COMMANDS PERLFUNC(1) open(FOO, "|tr '[a-z]' '[A-Z]'"); open(FOO, "|-") || exec 'tr', '[a-z]', '[A-Z]'; open(FOO, "cat -n '$file'|"); open(FOO, "-|") || exec 'cat', '-n', $file; パイプのファイルハンドルを明示的に close することで、 親プロセスは、チャイルドプロセスの終了を待ち、$? に ステータス値を返します。注: fork を行なう操作では、 フラッシュされていないバッファがあると、fork 後には、 そのバッファの内容が両方のプロセスで残ったままになっ てしまいますから、出力がダブらないように $| を設定す る必要があるかもしれません。 オープンするために渡されたファイル名は、はじめと終わ りの空白が取り除かれます。 妙な文字が含まれているよ うなファイル名をオープンするには、次のようにして、最 初と最後の空白を保護します: $file =~ s#^(\s)#./$1#; open(FOO, "< $file\0"); opendir DIRHANDLE,EXPR readdir()、telldir()、seekdir()、rewinddir()、 closedir() で処理するために、EXPR で指定された名前の ディレクトリをオープンします。 成功時には真を返しま す。 DIRHANDLE は、FILEHANDLE とは別に名前空間を持 っています。 ord EXPR EXPR の最初の文字の ASCII 値を返します。 EXPR を省 略した場合には、$_ を使用します。 pack TEMPLATE,LIST 配列か値のリストをとり、バイナリの構造体に入れ、その 構造体を含む文字列を返します。 TEMPLATE は、以下の ような値の型と順番を指定する文字を並べたものです: Perl manpages Last change: Release 5.0 Patchlevel 00 33 PERLFUNC(1) USER COMMANDS PERLFUNC(1) a ASCII 文字列、ヌル文字で埋める A ASCII 文字列、スペース文字で埋める b ビット列 (昇ビット順、vec() と同じ) B ビット列 (降ビット順) h 16 進数文字列 (低位ニブルが先) H 16 進数文字列 (高位ニブルが先) c signed char 値 C unsigned char 値 s signed short 値 S unsigned short 値 i signed int 値 I unsigned int 値 l signed long 値 L unsigned long 値 n "network" 順序 (ビッグエンディアン) の short N "network" 順序 (ビッグエンディアン) の long v "VAX" 順序 (リトルエンディアン) の short V "VAX" 順序 (リトルエンディアン) の long f 機種依存の単精度浮動小数点数 d 機種依存の倍精度浮動小数点数 p ヌル文字で終端する文字列へのポインタ P 構造体 (固定長文字列) へのポインタ u uuencode 文字列 x ヌル文字 X 1 文字後退 @ 絶対位置までヌル文字で埋める これらの文字の後には、繰り返し数を示す数字を付けるこ とができます。 "a"、"A"、"b"、"B"、"h"、"H" を以外 の型を使うとき、pack 関数は、LIST からその数の値を取 り出して使います。 くり返し数に * を指定すると、そ の時点で残っているすべての要素を意味します。 "a" や "A" という型を使うと、値を一つだけ取り出して使います が、繰り返し数で示す長さの文字列となるように、必要に 応じてヌル文字かスペース文字を付け足します。 (unpack するとき、"A" は後続のスペース文字やヌル文字を取り除 きますが、"a" はそのままにします。) 同様に、"b" や "B" は、繰り返し数で示すビット長のビット列に pack し ます。 (訳注: LIST から要素を 1 つだけ取り出し、そ の要素を文字列と見て、各文字の下位 1 ビットづつを取 り出して pack します。 最終的に半端なビットは 0 で 埋められます。) "h" や "H" は、そのニブル長のニブル 列に pack します。 "P" は、指定した長さの構造体への ポインタを pack します。 実数 (float と double) は、 機種依存のフォーマットしかありません。 いろんな浮動 小数点数のフォーマットが在り、標準的な "network" 表 Perl manpages Last change: Release 5.0 Patchlevel 00 34 PERLFUNC(1) USER COMMANDS PERLFUNC(1) 現といったものがないため、データ交換のための機能は用 意してありません。 つまり、あるマシンで pack した浮 動小数点数は、別のマシンでは読めないかもしれないとい うことです。 たとえ双方で IEEE フォーマットの浮動小 数点数演算を行なっていてもです (IEEE の仕様では、メ モリ表現上のバイト順序までは、規定されていないからで す)。 Perl では、(訳注: 特に指定しない限り) すべて の数値演算のために、内部的に double を使用しています。 double から float へ変換し、それから再び double に戻 すと精度が落ちることになります (つまり、unpack("f", pack("f", $foo)) は、一般には $foo と同じではないと いうことです)。 例: $foo = pack("cccc",65,66,67,68); # $foo eq "ABCD" $foo = pack("c4",65,66,67,68); # 同じ $foo = pack("ccxxcc",65,66,67,68); # $foo eq "AB\0\0CD" $foo = pack("s2",1,2); # リトルエンディアンでは、"\1\0\2\0" # ビッグエンディアンでは、"\0\1\0\2" $foo = pack("a4","abcd","x","y","z"); # "abcd" $foo = pack("aaaa","abcd","x","y","z"); # "axyz" $foo = pack("a14","abcdefg"); # "abcdefg\0\0\0\0\0\0\0" $foo = pack("i9pl", gmtime); # 実際の struct tm (とにかく私のシステムでは) sub bintodec { unpack("N", pack("B32", substr("0" x 32 . shift, -32))); } 一般には、pack で使用したものと同じテンプレートが、 unpack 関数でも使用できます。 pipe READHANDLE,WRITEHANDLE 対応するシステムコールと同じように、接続されたパイプ のペアをオープンします。 パイプでプロセスをループに するときには、よほど気を付けないと、デッドロックは起 こります。 さらに、Perl のパイプでは、stdio のバッ ファリングを使いますから、アプリケーションによっては、 Perl manpages Last change: Release 5.0 Patchlevel 00 35 PERLFUNC(1) USER COMMANDS PERLFUNC(1) コマンドごとに WRITEHANDLE をフラッシュするように、 $| を設定することが必要になるかもしれません。 pop ARRAY 配列の最後の値をポップして返し、配列の大きさを 1 だ け小さくします。 これは、 $tmp = $ARRAY[$#ARRAY--]; と同じ効果があります。 指定された配列に要素がなけれ ば、未定義値が返されます。 pos SCALAR 対象の変数に対して、前回の m//g が終了した場所のオフ セットを返します。 そのオフセットを変えるために、変 更することができます。 print FILEHANDLE LIST print LIST print 文字列かコンマで区切った文字列のリストを出力します。 成功時には、ゼロ以外を返します。 FAILEHANDLE は、ス カラ変数名でもよく、その場合には、その変数にファイル ハンドル名が入っているものとして扱われますから、一段 階の間接指定が行なえます。 (注: FILEHANDLE に変数を 使い、次のトークンが「項」のときには、間に + を置く か、引数の前後を括弧で括らなければ、誤って解釈される ことがあります。) FILEHANDLE を省略した場合には、標 準出力 (か、最後に選択された出力チャネル --- select() を参照) に出力します。 LIST も省略すると、$_ を STDOUT に出力することになります。 デフォルトの出力 チャネルを STDOUT 以外にしたければ、select 演算子を 使ってください。 print の引数は LIST です。 LIST の中のものは、すべてリストコンテキストで評価されます。 サブルーティンの呼び出しがあれば、リストコンテキスト では、複数の値を返すかもしれません。 また、すべての 引数を括弧で括るのでなければ、print というキーワード の次に開き括弧を書いてはいけません。 "print" と引数 の間に "+" を書くか、すべての引数を括弧で括ってくだ さい。 printf FILEHANDLE LIST printf LIST "print FILEHANDLE sprintf(LIST)" と等価です。 LIST の最初の要素は、printf フォーマットと解釈されます。 push ARRAY,LIST ARRAY をスタックとして扱い、LIST 内の値を ARRAY の終 わりにプッシュします。 ARRAY の大きさは、LIST の長さ 分だけ大きくなります。 これは、 Perl manpages Last change: Release 5.0 Patchlevel 00 36 PERLFUNC(1) USER COMMANDS PERLFUNC(1) for $value (LIST) { $ARRAY[++$#ARRAY] = $value; } とするのと同じ効果がありますが、より効率的です。 変 更後の配列の要素数を返します。 q/STRING/ qq/STRING/ qx/STRING/ qw/STRING/ 汎用のクォート。 perlop manpage を参照。 quotemeta EXPR EXPR の中のすべての正規表現のメタ文字をバックスラッ シュでエスケープしたものを返します。 これは、ダブル クォート文字列での \Q エスケープをインプリメントする ための内部関数です。 rand EXPR rand 0 から EXPR の値までの小数の乱数値を返します。 (EXPR は正の数である必要があります。) EXPR を省略すると、 0 から 1 までの値を返します。 この関数は、srand() を呼ばなければ、数列を繰り返して生成するかもしれませ ん。 srand() も参照してください。 (注: もし、rand 関数が、常に大きい値ばかりや、小さい 数ばかりを返すようなら、お使いになっている Perl が、 良くない RANDBITS を使ってコンパイルされている可能性 があります。 取り敢えず、EXPR に適切な範囲に収まる ように 2 のべき乗をかけることで凌ぐ事ができます。 ただし、このようにした場合には、移植性に欠けたものに なります。 できれば、再コンパイルした方が、良いでし ょう。) read FILEHANDLE,SCALAR,LENGTH,OFFSET read FILEHANDLE,SCALAR,LENGTH 指定した FILEHANDLE から、変数 SCALAR に LENGTH バイ トのデータを読み込みます。 実際に読み込まれたバイト 数か、エラー時には undef を返します。 SCALAR は、実 際に読み込んだ長さに応じて、伸び縮みします。 OFFSET を指定すると、SCALAR の先頭以外の場所から、読み込みを 行ないうことができます。 この関数は、stdio ライブラ リの fread() 関数を使ってインプリメントしています。 実際のシステムコールを利用するには、sysread() を参照 してください。 Perl manpages Last change: Release 5.0 Patchlevel 00 37 PERLFUNC(1) USER COMMANDS PERLFUNC(1) readdir DIRHANDLE opendir() でオープンしたディレクトリで、次のディレク トリエントリを返します。 リストコンテキストで用いる と、そのディレクトリの残りのエントリを、すべて返しま す。 エントリが残っていない場合には、スカラコンテキ ストでは未定義値を、リストコンテキストでは空リストを 返します。 readlink EXPR シンボリックリンクがインプリメントされていれば、シン ボリックリンクの値を返します。 インプリメントされて いないときには、致命的エラーとなります。 何らかのシ ステムエラーが検出されると、未定義値を返し、$! (errno) を設定します。 EXPR を省略すると、$_ を使用します。 recv SOCKET,SCALAR,LEN,FLAGS ソケット上のメッセージを受信します。 指定されたファ イルハンドル SOCKET から、変数 SCALAR に LENGTH バイ トのデータを読み込もうとします。 実際には、C の recvfrom() を呼びますので、送信側のアドレスを返すこ とができます。 エラー発生時には、未定義値を返します。 SCALAR は、実際に読まれた長さによって、大きくなった り、小さくなったりします。 同名のシステムコールと同 じ FLAGS を使います。 redo LABEL redo redo コマンドは、条件を再評価しないで、ループブロッ クの始めからもう一度実行を開始します。 continue ブ ロックがあっても、実行されません。 LABEL が省略され ると、このコマンドは、もっとも内側のループを参照しま す。 このコマンドは通常、自分への入力を欺くために使 用します: # 単純な Pascal のコメント除去プログラム # (警告: 文字列中には { や } がないと仮定) LINE: while (<STDIN>) { while (s|({.*}.*){.*}|$1 |) {} s|{.*}| |; if (s|{.*| |) { $front = $_; while (<STDIN>) { if (/}/) { # コメントの終わり s|^|$front{|; redo LINE; } } } print; } Perl manpages Last change: Release 5.0 Patchlevel 00 38 PERLFUNC(1) USER COMMANDS PERLFUNC(1) ref EXPR EXPR がリファレンスであれば、真を返し、さもなくば、 偽を返します。 返される値は、リファレンスが参照する ものの型に依存します。 組み込みの型には、 REF SCALAR ARRAY HASH CODE GLOB があります。 参照されるオブジェクトが、何らかのパッ ケージに 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"; } perlref manpage も参照してください。 rename OLDNAME,NEWNAME ファイルの名前を変更します。 成功時には 1、失敗時に は 0 を返します。 ファイルシステムにまたがって、パ ス名を付け替えることはできません。 require EXPR require 指定する EXPR か、EXPR 省略時には $_ によって、いく つかの意味を使い分けます。 EXPR が数値のときには、 実行中の Perl のバージョン ($] か $PERL_VERSION) が EXPR 以上であることが必要となります。 数値でない場合には、既に読み込まれていないときに、読 み込むライブラリファイルを要求するものとなります。 そのファイルは、基本的には eval() の一種である、 do-FILE によって読み込まれます。 意味的には、次のよ うなサブルーティンと同じようなものです: Perl manpages Last change: Release 5.0 Patchlevel 00 39 PERLFUNC(1) USER COMMANDS PERLFUNC(1) sub require { local($filename) = @_; return 1 if $INC{$filename}; local($realfilename,$result); ITER: { foreach $prefix (@INC) { $realfilename = "$prefix/$filename"; if (-f $realfilename) { $result = do $realfilename; last ITER; } } die "Can't find $filename in \@INC"; } die $@ if $@; die "$filename did not return true value" unless $result; $INC{$filename} = $realfilename; $result; } ファイルは、同じ名前で 2 回読み込まれることはありま せん。 初期化コードの実行がうまくいったことを示すた めに、ファイルは真を返さなければなりませんから、真を 返すようになっている自信がある場合を除いては、ファイ ルの最後に "1;" と書くのが習慣です。 実行文を追加す るような場合に備えて、"1;" と書いておいた方が良いで しょう。 EXPR が裸の単語であるときには、標準モジュールのロー ドを簡単にするように、require は拡張子が ".pm" であ ると仮定します。 この形式のモジュールロードは、名前 空間を変更してしまう危険はありません。 より強力な import 機能については、このドキュメントの use() の項と、perlmod manpage をご覧ください。 reset EXPR reset 通常、ループの最後に、変数をクリアし、?? 検索を再び 動作するようにリセットするため、continue ブロックで 使われます。 EXPR は、文字を並べたもの (範囲を指定 するのに、ハイフンが使えます) と解釈されます。 名前 がその文字のいずれかで始まる変数や配列は、最初の状態 にリセットされます。 EXPR を省略すると、1 回検索 (?PATTERN?) を再びマッチするようにリセットできます。 カレントパッケージの変数もしくは検索だけがリセットさ れます。 常に 1 を返します。 例: reset 'X'; # すべての X 変数をリセット reset 'a-z'; # 小文字変数をリセット reset; # ?? 検索だけをリセット Perl manpages Last change: Release 5.0 Patchlevel 00 40 PERLFUNC(1) USER COMMANDS PERLFUNC(1) reset "A-Z" とすると、ARGV や ENV といった配列もなく なってしまいますから、止めた方が良いでしょう。 パッ ケージ変数だけがリセットされます。 字句変数は、影響 を受けませんが、スコープから外れれば、自動的に綺麗に なりますので、これからは、こちらを使うようにした方が よいでしょう。 このドキュメントの my の項を参照して ください。 return LIST サブルーティンや eval から指定した値をもって、リター ンします。 (サブルーティンや eval に return がなけ れば、最後に評価された値で、自動的にリターンします。) reverse LIST リストコンテキストでは、LIST を構成するよ要素を逆順 に並べた、リスト値を返します。 スカラコンテキストで は、LIST の最初の要素のバイト順序を逆順にした文字列 を返します。 (訳注: 4.036 では、スカラコンテキストで最初の要素で はなく、最後の要素の逆順にします。 5.0000 では、ス カラコンテキストでリストをつなげた文字列を反転してい るようです。) rewinddir DIRHANDLE DIRHANDLE に対する readdir() ルーティンの現在位置を ディレクトリの最初に設定します。 rindex STR,SUBSTR,POSITION rindex STR,SUBSTR STR 中で最後に見つかった SUBSTR の位置を返すことを除 いて、index と同じように動作します。 POSITION を指 定すると、その位置より前の、最後の位置を返します。 rmdir FILENAME FILENAME で指定したディレクトリが空であれば、そのデ ィレクトリを削除します。 成功時には 1 を返し、失敗 時には 0 を返し、$! (errno) を設定します。 FILENAME を省略した場合には、$_ を使用します。 s/// 置換演算子。 perlop manpage を参照してください。 scalar EXPR EXPR を強制的にスカラコンテキストで解釈されるように して、EXPR の値を返します。 seek FILEHANDLE,POSITION,WHENCE stdio ライブラリの fseek() 関数のように、FILEHANDLE のファイルポインタを任意の位置に設定します。 FILEHANDLE は、実際のファイルハンドル名を与える式で もかまいません。 WHENCE の値が、0 ならば、ファイル ポインタを POSITION の位置へ、1 ならば、現在位置から Perl manpages Last change: Release 5.0 Patchlevel 00 41 PERLFUNC(1) USER COMMANDS PERLFUNC(1) POSITION 離れた位置へ、2 ならば、EOF から POSITION だけ離れた位置へ、ファイルポインタを設定します。 こ の値には、POSIX モジュールで使われている SEEK_SET、 SEEK_CUR、SEEK_END を使うこともできます。 成功時に は、1 を、失敗時には 0 を返します。 seekdir DIRHANDLE,POS DIRHANDLE での readdir() ルーティンの現在位置を設定 します。 POS は、telldir() が返す値でなければなりま せん。 同名のシステムライブラリルーティンと同じく、 ディレクトリ縮小時の問題が考えられます。 select FILEHANDLE select その時点で、選択されていたファイルハンドルを返します。 FILEHANDLE を指定した場合には、その値を出力のデフォ ルトファイルハンドルに設定します。 これには、2 つの 効果があります。 まず、ファイルハンドルを指定しない で write や print を行なった場合のデフォルトが、この FILEHANDLE になります。 もう一つは、出力関連の変数 への参照は、この出力チャネルを参照するようになります。 たとえば、複数の出力チャネルに対して、ページ先頭フォ ーマットを設定しなければならないのであれば、 select(REPORT1); $^ = 'report1_top'; select(REPORT2); $^ = 'report2_top'; のようにしなければならないでしょう。 FILEHANDLE は、実際のファイルハンドルの名前を示す、 式でもかまいません。 つまり、 $oldfh = select(STDERR); $| = 1; select($oldfh); のようなものです。 Perl 5 では、ファイルハンドルはメソッドを持ったオブ ジェクトですから、最後の例は use FileHandle; STDERR->autoflush(1); のように書くと良いでしょう。 select RBITS,WBITS,EBITS,TIMEOUT これは、select(2) システムコールを、指定したビットマ スクで呼び出します。 ビットマスクは、fileno() と vec() を使って、 Perl manpages Last change: Release 5.0 Patchlevel 00 42 PERLFUNC(1) USER COMMANDS PERLFUNC(1) $rin = $win = $ein = ''; vec($rin,fileno(STDIN),1) = 1; vec($win,fileno(STDOUT),1) = 1; $ein = $rin | $win; のようにして作成することができます。 複数のファイルハンドルに select を行ないたいのであれ ば、 sub fhbits { local(@fhlist) = split(' ',$_[0]); local($bits); for (@fhlist) { vec($bits,fileno($_),1) = 1; } $bits; } $rin = &fhbits('STDIN TTY SOCK'); のようなサブルーティンを書くとよいでしょう。 通常は、 ($nfound,$timeleft) = select($rout=$rin, $wout=$win, $eout=$ein, $timeout); のように使い、いずれかの準備が整うまでブロックするに は、 $nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef); のようにします。 どのビットマスクにも undef を設定 することができます。 TIMEOUT を指定するときは、秒数 で指定し、少数でかまいません。 注: すべてのインプリ メンテーションで、$timeleft が返せるものではありませ ん。 その場合、$timeleft には、常に指定した TIMEOUT と同じ値が返されます。 250 ミリ秒の sleep と同じ効果が、 select(undef, undef, undef, 0.25); のようにして得られます。 (マイクロ秒じゃないよ :-)) semctl ID,SEMNUM,CMD,ARG System V IPC 関数 semctl を呼び出します。 CMD が、 &IPC_STAT か &GETALL のときには、ARG は、返される semid_ds 構造体か、セマフォ値の配列を納める変数でな ければなりません。 ioctl と同じように、エラー時には 未定義値、ゼロのときは "0 but true"、それ以外なら、 その値そのものを返します。 Perl manpages Last change: Release 5.0 Patchlevel 00 43 PERLFUNC(1) USER COMMANDS PERLFUNC(1) semget KEY,NSEMS,FLAGS System V IPC 関数 semget を呼び出します。 セマフォ ID か、エラー時には未定義値を返します。 semop KEY,OPSTRING シグナルを送信や、待ち合わせなどのセマフォ操作を行な うために、System V IPC 関数 semop を呼び出します。 OPSTRING は、semop 構造体の pack された配列でなけれ ばなりません。 semop 構造体は、それぞれ、 pack("sss", $semnum, $semop, $semflag) のように作る ことができます。 セマフォ操作の数は、OPSTRING の長 さからわかります。 成功時には真を、エラー時には偽を 返します。 例として、 $semop = pack("sss", $semnum, -1, 0); die "Semaphore trouble: $!\n" unless semop($semid, $semop); は、セマフォ ID $semid のセマフォ $semnum で待ち合わ せを行ないます。 セマフォにシグナルを送るには、"-1" を "1" に変更してください。 send SOCKET,MSG,FLAGS,TO send SOCKET,MSG,FLAGS SOCKET に MSG を送ります。 FLAGS には、同名のシステ ムコールと同じフラグを指定します。 接続していないソ ケットには、送信先 TO を指定しなければならず、この場 合、C の sendto() を実行します。 送信した文字数か、 エラー時には、未定義値を返します。 setpgrp PID,PGRP 指定した PID (0 を指定するとカレントプロセス) に対す るプロセスグループを設定します。 setpgrp(2) がイン プリメントされていないマシンでは、致命的エラーが発生 します。 setpriority WHICH,WHO,PRIORITY プロセス、プロセスグループ、ユーザに対する優先順位を 設定します。 (setpriority(2) を参照してください。) setpriority(2) がインプリメントされていないマシンで は、致命的エラーが発生します。 setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL 要求したソケットオプションを設定します。 エラー時に は、未定義値が返されます。 引数を渡したくない場合に は、OPTVAL に undef を指定します。 shift ARRAY shift 配列の最初の値を取り出して、その値を返し、配列を一つ 短くして、すべての要素を前へずらします。 配列に要素 がなければ、未定義値を返します。 ARRAY を省略すると、 Perl manpages Last change: Release 5.0 Patchlevel 00 44 PERLFUNC(1) USER COMMANDS PERLFUNC(1) メインプログラムでは、@ARGV 配列を shift し、サブル ーティンでは、@_ 配列を shift します。 (これは、文 面上で決まります。) unshift()、push()、pop() も参照 してください。 shift() と unshift() は、push() と pop() が配列の右端で行なうことを、左端で行ないます。 shmctl ID,CMD,ARG System V IPC 関数 shmctl を呼び出します。 CMD が、 &IPC_STAT ならば、ARG は、返される shmid 構造体を納 める変数でなければなりません。 ioctl と同じように、 エラー時には未定義値、ゼロのときは "0 but true"、そ れ以外なら、その値そのものを返します。 shmget KEY,SIZE,FLAGS System V IPC 関数 shmget を呼び出します。 共有メモ リのセグメント ID か、エラー時には未定義値を返します。 shmread ID,VAR,POS,SIZE shmwrite ID,STRING,POS,SIZE System V 共有メモリセグメント ID に対し、アタッチし て、コピーを行ない、デタッチするという形で、位置 POS から、サイズ SIZE だけ、読み込みか書き込みを行ないま す。 読み込み時には、VAR は読み込んだデータを納める 変数でなければなりません。 書き込み時には、STRING が長すぎても、SIZE バイトだけが使われます。 STRING が短すぎる場合には、SIZE バイトを埋めるために、ヌル 文字が書き込まれます。 成功時には真を、エラー時には 偽を返します。 shutdown SOCKET,HOW 同名のシステムコールと同じように解釈される HOW によ って、指定された方法でソケット接続のシャットダウンを 行ないます。 sin EXPR (ラジアンで示した) EXPR の正弦を返します。 EXPR が 省略されたときには、$_ の正弦を取ります。 sleep EXPR sleep スクリプトを EXPR で指定した秒数 (省略時には、永久に) スリープさせます。 そのプロセスには、SIGALRM を送る ことで、割り込みを掛けることができます。 実際にスリ ープした秒数を返します。 sleep() は、alarm() を使っ てインプリメントされることが多いので、alarm() と sleep() は、おそらく混ぜて使用することはできません。 古いシステムでは、どのように秒を数えるかによって、要 求した秒数に完全に満たないうちに、スリープから抜ける 場合があります。 最近のシステムでは、常に完全にスリ ープします。 Perl manpages Last change: Release 5.0 Patchlevel 00 45 PERLFUNC(1) USER COMMANDS PERLFUNC(1) socket SOCKET,DOMAIN,TYPE,PROTOCOL 指定した種類のソケットをオープンし、ファイルハンドル SOCKET にアタッチします。 DOMAIN、TYPE、PROTOCOL は、 同名のシステムコールと同じように指定します。 適切な 定義を import するために、まず、"use Socket;" とする とよいでしょう。 perlipc manpage の例を参照してくだ さい。 socketpair SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL 指定した DOMAIN に、指定した TYPE で名前の無いソケッ トのペアを生成します。 DOMAIN、TYPE、PROTOCOL は、 同名のシステムコールと同じように指定します。 インプ リメントされていない場合には、致命的エラーとなります。 成功時には真を返します。 sort SUBNAME LIST sort BLOCK LIST sort LIST LIST をソートし、ソートされたリスト値を返します。 配列内の存在しない値は、なくなります。 SUBNAME や BLOCK を省略すると、標準の文字列比較の順番でソートが 行なわれます。 SUBNAME を指定すると、それは、配列の 要素をどのような順番に並べるかに応じて、負、ゼロ、正 の整数を返すサブルーティンの名前であると解釈されます。 (このようなルーティンには、<=> 演算子や cmp 演算子が、 たいへん便利です。) SUBNAME は、スカラ変数でもよく、 その場合には、その値が使用するサブルーティンの名前と 解釈されます。 SUBNAME の代わりに、無名のインライン ソートルーティンとして、BLOCK を書くことができます。 効率化のために、このサブルーティンでは、通常の呼び出 し処理は行なわれず、以下のような制約があります。 こ のサブルーティンは、再帰サブルーティンであってはなり ません。 比較のためサブルーティンに渡される 2 つの 要素は、@_ ではなく、$a と $b で渡されます (次の例を 参照してください)。 これらはリファレンスによって渡 されるので、$a や $b を変更しないでください。 例: # 文字の順でソート @articles = sort @files; # 同じことを明示的にソートルーティンを指定して @articles = sort {$a cmp $b} @files; # 同じことを逆順に @articles = sort {$b cmp $a} @files; # 数値の昇順にソート @articles = sort {$a <=> $b} @files; Perl manpages Last change: Release 5.0 Patchlevel 00 46 PERLFUNC(1) USER COMMANDS PERLFUNC(1) # 数値の降順にソート @articles = sort {$b <=> $a} @files; # サブルーティン名を指定してソート sub byage { $age{$a} <=> $age{$b}; # 整数を仮定 } @sortedclass = sort byage @class; sub backwards { $b cmp $a; } @harry = ('dog','cat','x','Cain','Abel'); @george = ('gone','chased','yz','Punished','Axed'); print sort @harry; # AbelCaincatdogx と出力 print sort backwards @harry; # xdogcatCainAbel と出力 print sort @george, 'to', @harry; # AbelAxedCainPunishedcatchaseddoggonetoxyz と出力 splice ARRAY,OFFSET,LENGTH,LIST splice ARRAY,OFFSET,LENGTH splice ARRAY,OFFSET ARRAY から OFFSET、LENGTH で指定される要素を取り除き、 LIST があれば、それを代わりに挿入します。 配列から 取り除かれた要素を返します。 配列は、必要に応じて、 大きくなったり、小さくなったりします。 LENGTH が省 略されると、OFFSET 以降のすべての要素を取り除きます。 以下は、($[ == 0 と仮定すると) それぞれ、等価です。 push(@a,$x,$y) splice(@a,$#a+1,0,$x,$y) pop(@a) splice(@a,-1) shift(@a) splice(@a,0,1) unshift(@a,$x,$y) splice(@a,0,0,$x,$y) $a[$x] = $y splice(@a,$x,1,$y); 次の例では、配列の前に、それぞれの配列の大きさが渡さ れるものとしています: sub aeq { # 2 つのリスト値を比較する local(@a) = splice(@_,0,shift); local(@b) = splice(@_,0,shift); return 0 unless @a == @b; # 長さは等しいか while (@a) { return 0 if pop(@a) ne pop(@b); } return 1; } if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... } Perl manpages Last change: Release 5.0 Patchlevel 00 47 PERLFUNC(1) USER COMMANDS PERLFUNC(1) split /PATTERN/,EXPR,LIMIT split /PATTERN/,EXPR split /PATTERN/ split 文字列を文字列の配列に分割して、それを返します。 リストコンテキストでない場合には、見つかったフィール ドの数を返し、配列 @_ に分割結果を設定します。 (リ ストコンテキストでは、パターンの区切り文字に ?? を使 うことで、強制的に @_ に分割結果を残すことができます が、返却値は配列値のままです。) しかし、暗黙の @_ への split は使わないようにしてください。 EXPR を省略すると、文字列 $_ を split します。 もし、 PATTERN も省略すると、空白 (/[ \t\n]+/) で split し ます。 PATTERN にマッチするものは、フィールドを分割 するデリミタとして扱われます。 (デリミタは、1 文字 とは限りません。) 負でない LIMIT を指定した場合には、 最大その数までのフィールドに split します (しかし、 それより少ないことはあります)。 LIMIT を指定しない と、末尾の空フィールドを捨ててしまいます (pop() を行 なうときには気を付けないといけません)。 LIMIT が負 ならば、LIMIT に任意の大きな数を指定したのと同じこと になります。 空文字列にマッチするパターン (ヌルパターン // と混同 しないでください。 これは、空文字列にマッチするパタ ーンの一つでしかありません) は、どの場所にもマッチし、 EXPR の値を1 文字ずつに分割します。 たとえば、 print join(':', split(/ */, 'hi there')); は、'h:i:t:h:e:r:e' という出力になります。 LIMIT を使うと、行を部分的に split することができま す。 ($login, $passwd, $remainder) = split(/:/, $_, 3); リストへ代入するとき、LIMIT を省略すると、Perl は、 無駄な仕事を避けるため、そのリストの変数の数より、1 つだけ大きい LIMIT が与えられたものとして処理を行な います。 上のリストの場合には、LIMIT はデフォルトで 4 になります。 時間が問題となるアプリケーションでは、 必要以上のフィールドに分けないようにする必要がありま す。 PATTERN に括弧が含まれていると、デリミタ内の部分文字 列にマッチするものも、配列要素に含まれるようになりま す。 Perl manpages Last change: Release 5.0 Patchlevel 00 48 PERLFUNC(1) USER COMMANDS PERLFUNC(1) split(/([,-])/, "1-10,20"); は、リスト値 (1, '-', 10, ',', 20) を生成します。 /PATTERN/ は、実行時に変わるパターンを指定する式で置 き換えることができます。 (実行時のコンパイルを 1 度 にするために、/$variable/o を使ってください。) 特別 な場合として、スペース (' ') を指定すると、引数なし の split のように空白で split を行ないますが、先頭の 空白で、最初に空のフィールドができません。 つまり、 split(' ') は、awk のデフォルトの動作をエミュレート するために使うことができ、split(/ /) は行頭のスペー スの数に応じた空フィールドができます。 例: open(passwd, '/etc/passwd'); while (<passwd>) { ($login, $passwd, $uid, $gid, $gcos, $home, $shell) = split(/:/); ... } (上記の $shell には、まだ改行がついたままです。 こ のドキュメントの chop、chomp、join の項を参照してく ださい。) sprintf FORMAT,LIST 普通の C 言語の printf 記法のフォーマットで、整形さ れた文字列を返します。 (長さの間接指定のための * 文 字はサポートされていませんが、変数をパターン内で展開 すれば、同じ結果となります。) sqrt EXPR EXPR の平方根を返します。 EXPR を省略すると、$_ の 平方根を返します。 srand EXPR rand 演算子のためのシード値を設定します。 EXPR を省 略すると、srand(time) を実行します。 もちろん、現在 時間を想像するのは容易いことですから、暗号処理には、 もっとランダムな値を使う必要があるがあります。 急激 に変化する OS のステータス値プログラムの出力を圧縮し て、チェックサムをとる、というようなことが普通、行な われます。 例は、定期定期に comp.security.unix に投 稿されます。 Perl manpages Last change: Release 5.0 Patchlevel 00 49 PERLFUNC(1) USER COMMANDS PERLFUNC(1) stat FILEHANDLE stat EXPR FILEHANDLE を通じてオープンされているファイルか、 EXPR で指定されるファイルの情報を与える、13 要素の配 列を返します。 stat に失敗した場合には、空リストを 返します。 普通は、 ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename); のようにして使います。 下線だけの _ という、特別なファイルハンドルを、stat に渡すと、実際には stat を行なわず、stat 構造体に残 っている、前回の stat やファイルテストの情報が返され ます。 例: if (-x $file && (($d) = stat(_)) && $d < 0) { print "$file is executable NFS file\n"; } (これは、NFS のもとでデバイス番号が負になるマシンで のみ動作します。) study SCALAR study 次に変更される前に、何回も文字列に対するパターンマッ チを行なうアプリケーションで、そのような文字列 SCALAR (省略時には $_) を予め学習しておきます。 これは、検 索のために、どのようなパターンを何回使うかによって、 また、検索される文字列内の文字頻度の分布によって、時 間を節約することになるかもしれませんし、逆に浪費する ことになるかもしれません。 予習をした場合と、しない 場合の実行時間を比較して、どちらが速いか調べることが、 必要でしょう。 短い固定文字列 (複雑なパターンの固定 部分を含みます) をたくさん検索するループで、もっとも 効果があるでしょう。 一つの時点では、一つの study だけが有効です。 別のスカラを study した場合には、 以前に学習した内容は「忘却」されてしまいます。 (こ の study の仕組みは、まず、検索される文字列内のすべ ての文字のリンクされたリストが作られ、たとえば、すべ ての 'k' がどこにあるかがわかるようになります。 各 おのの検索文字列から、C プログラムや英語のテキストか ら作られた、頻度の統計情報に基づいて、もっともめずら しい文字が選ばれます。 この「めずらしい」文字を含む 場所だけが調べられるのです。) たとえば、特定のパターンを含む行の前にインデクスを付 けるエントリを入れる例を示します。 Perl manpages Last change: Release 5.0 Patchlevel 00 50 PERLFUNC(1) USER COMMANDS PERLFUNC(1) while (<>) { study; print ".IX foo\n" if /\bfoo\b/; print ".IX bar\n" if /\bbar\b/; print ".IX blurfl\n" if /\bblurfl\b/; ... print; } "f" は "o" よりもめずらしいので、/\bfoo\b/ を探すと き、$_ で "f" を含む場所だけが探されます。 一般に、 病的な場合を除いて、かなりの結果が得られます。 唯一 の問題は、節約できる時間が、最初にリンクリストを作る 時間よりも多いかどうかです、 実行時まで、探そうとする文字列がわからないときには、 ループ全体を文字列として組み立てて、eval すれば、い つも、ずべてのパターンを再コンパイルするという事態は 避けられます。 ファイル全体を一つのレコードとして入 力するために、$/ を未定義にすれば、かなり速くなり、 多くの場合 fgrep(1) のような専用のプログラムより速く なります。 以下の例は、ファイルのリスト (@files) か ら単語のリスト (@words) を探して、マッチするものがあ ったファイル名を出力します。 $search = 'while (<>) { study;'; foreach $word (@words) { $search .= "++\$seen{\$ARGV} if /\\b$word\\b/;\n"; } $search .= "}"; @ARGV = @files; undef $/; eval $search; # ぶっ飛ばす $/ = "\n"; # 入力のデリミタをもとに戻す foreach $file (sort keys(%seen)) { print $file, "\n"; } substr EXPR,OFFSET,LEN substr EXPR,OFFSET EXPR から、部分文字列を取り出して返します。 最初の 文字がオフセット 0 もしくは、$[ に設定した値となりま す。 OFFSET に負の値を設定すると、EXPR の終わりから のオフセットとなります。 LEN を省略すると、EXPR の 最後まですべてが返されます。 substr() を左辺値とし て使用することも可能で、その場合には、EXPR が左辺値 でなければなりません。 LEN より短いものを代入したと きには、EXPR は短くなり、LEN より長いものを代入した ときには、EXPR はそれに合わせて伸びることになります。 EXPR の長さを一定に保つためには、sprintf() を使って、 Perl manpages Last change: Release 5.0 Patchlevel 00 51 PERLFUNC(1) USER COMMANDS PERLFUNC(1) 代入する値の長さを調整することが、必要になるかもしれ ません。 symlink OLDFILE,NEWFILE NEWFILE として、OLDFILE へのシンボリックリンクを生成 します。 成功時には 1 を返し、失敗時には 0 を返しま す。 シンボリックリンクをサポートしていないシステム では、実行時に致命的エラーが発生します。 これをチェ ックするには、eval を使用します: $symlink_exists = (eval 'symlink("","");', $@ eq ''); syscall LIST LIST の最初の要素で指定するシステムコールを、残りの 要素をそのシステムコールの引数として呼び出します。 インプリメントされていないときには、致命的エラーとな ります。 引数は、以下のように解釈されます: 引数が数 字であれば、int として引数を渡します。 そうでなけれ ば、文字列値へのポインタが渡されます。 文字列に結果 を受け取るときには、その結果を受け取るのに十分なくら いに、文字列を予め伸ばしておく必要があります。 整数 引数が、リテラルでなく、数値コンテキストで評価された ことのないものであれば、数値として解釈されるように、 0 を足しておく必要があるかもしれません。 require 'syscall.ph'; # h2ph を実行する必要があるかも syscall(&SYS_write, fileno(STDOUT), "hi there\n", 9); Perl は、システムコールに最大 14 個の引数しか渡せま せんが、実用上問題はないでしょう。 sysread FILEHANDLE,SCALAR,LENGTH,OFFSET sysread FILEHANDLE,SCALAR,LENGTH システムコール read(2) を用いて、指定した FILEHANDLE から、変数 SCALAR へ、LENGTH バイトのデータの読み込 みを試みます。 これは、stdio ルーティンを通りません から、他の入力関数と混ぜて使うと、入力がおかしくなる かもしれません。 実際に読み込まれたデータの長さか、 エラー時には undef が返されます。 SCALAR は、実際に 読み込んだ長さに応じて、伸び縮みします。 OFFSET を 指定すると、SCALAR の先頭以外の場所から、読み込みを 行ないうことができます。 system LIST "exec LIST" とほとんど同じですが、まず fork を行ない、 親プロセスではチャイルドプロセスが終了するのを wait します。 exec の項で述べたように、引数の処理は、引 数の数によって異なることに注意してください。 返却値 は、wait() が返すプログラムの exit 状態です。 実際 の exit 値を得るには 256 で割ってください。 このド Perl manpages Last change: Release 5.0 Patchlevel 00 52 PERLFUNC(1) USER COMMANDS PERLFUNC(1) キュメントの exec の項も参照してください。 syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET syswrite FILEHANDLE,SCALAR,LENGTH write(2) システムコールを使って、指定した FILEHANDLE へ、変数 SCALAR から、LENGTH バイトのデータの書き込 みを試みます。 これは、stdio ルーティンを通りません から、他の出力関数と混ぜて使うと、出力がおかしくなる かもしれません。 実際に読み込まれたデータの長さか、 エラー時には undef が返されます。 OFFSET を指定する と、SCALAR の先頭以外の場所から、データを取り出して、 書き込みを行ないうことができます。 tell FILEHANDLE tell FILEHANDLE の現在のファイル位置を返します。 FILEHANDLE は、実際のファイルハンドル名を示す式でも かまいません。 FILEHANDLE が省略された場合には、最 後に読み込みを行なったファイルについて調べます。 telldir DIRHANDLE DIRHANDLE 上の readdir() ルーティンに対する現在位置 を返します。 値は、そのディレクトリで特定の位置をア クセスするため、seekdir() に渡すことができます。 同 名のシステムライブラリルーティンと同じく、ディレクト リ縮小時の問題が考えられます。 tie VARIABLE,PACKAGENAME,LIST この関数は、変数を、その変数のインプリメンテーション を行なうパッケージと結び付けます。 VARIABLE は、魔 法をかける変数の名前です。 PACKAGENAME は、正しい型 のオブジェクトをインプリメントする、パッケージの名前 です。 他に引数があれば、そのパッケージの "new" メ ソッドに渡されます。 通常、これらは、C の dbm_open() などの関数に渡す引数となります。 大きな DBM ファイルでは、keys() や values() のような 関数は、大きな配列値を返す可能性があります。 大きな DBM ファイルでは、each() 関数を使って繰り返しを行な った方が、よいかもしれません。 例: # print out history file offsets tie(%HIST, NDBM_File, '/usr/lib/news/history', 1, 0); while (($key,$val) = each %HIST) { print $key, ' = ', unpack('L',$val), "\n"; } untie(%HIST); Perl manpages Last change: Release 5.0 Patchlevel 00 53 PERLFUNC(1) USER COMMANDS PERLFUNC(1) 連想配列をインプリメントするパッケージでは、次のよう なメソッドを用意します: TIEHASH objectname, LIST DESTROY this FETCH this, key STORE this, key, value DELETE this, key EXISTS this, key FIRSTKEY this NEXTKEY this, lastkey 通常の配列をインプリメントするパッケージでは、次のよ うなメソッドを用意します: TIEARRAY objectname, LIST DESTROY this FETCH this, key STORE this, key, value [others TBD] スカラ変数をインプリメントするパッケージでは、次のよ うなメソッドを用意します: TIESCALAR objectname, LIST DESTROY this FETCH this, STORE this, value time UTC で 1970 年 1 月 1 日 00:00:00 からの連続秒数を返 します。 gmtime() や localtime() への入力形式にあっ ています。 times 現プロセスと、そのチャイルドプロセスに対する、ユーザ 時間とシステム時間を秒で示した、4 要素のリスト値を返 します。 ($user,$system,$cuser,$csystem) = times; tr/// 変換演算子。 perlop manpage を参照してください。 truncate FILEHANDLE,LENGTH truncate EXPR,LENGTH FILEHANDLE 上にオープンされたファイルか、EXPR で名前 を表わしたファイルを、指定した長さに切り詰めます。 システム上に truncate がインプリメントされていなけれ ば、致命的エラーとなります。 Perl manpages Last change: Release 5.0 Patchlevel 00 54 PERLFUNC(1) USER COMMANDS PERLFUNC(1) uc EXPR EXPR を大文字に変換したものを返します。 これは、ダ ブルクォート文字列における、\U エスケープをインプリ メントする内部関数です。 ucfirst EXPR 最初の文字だけを大文字にした、EXPR を返します。 こ れは、ダブルクォート文字列における、\u エスケープを インプリメントする内部関数です。 umask EXPR umask 現在のプロセスの umask を設定し、以前の値を返します。 EXPR が省略されると、単にその時点の umask の値を返し ます。 undef EXPR undef 左辺値である EXPR の値を未定義にします。 スカラ値、 配列全体、("&" を使った) サブルーティン名だけに使用 します。 (特殊変数や DBM リスト値に undef() しても、 おそらく期待通りの結果にはなりませんから、しないでく ださい。) 常に未定義値を返します。 EXPR は省略する ことができ、その場合には、何も未定義にされませんが、 未定義値は返されますので、それを、たとえば、サブルー ティンの返却値として使うことができます。 例: undef $foo; undef $bar{'blurfl'}; undef @ary; undef %assoc; undef &mysub; return (wantarray ? () : undef) if $they_blew_it; unlink LIST LIST に含まれるファイルを削除します。 削除に成功し たファイルの数を返します。 $cnt = unlink 'a', 'b', 'c'; unlink @goners; unlink <*.bak>; 注: スーパーユーザ権限で、Perl に -U を付けて実行し た場合でなければ、unlink でディレクトリを削除するこ とはありません。 この条件にあう場合にも、ディレクト リの削除は、ファイルシステムに多大な損害を与える可能 性がありますので、特に注意が必要です。 rmdir を代わ りに使ってください。 Perl manpages Last change: Release 5.0 Patchlevel 00 55 PERLFUNC(1) USER COMMANDS PERLFUNC(1) unpack TEMPLATE,EXPR unpack は pack の逆を行ないます: 構造体を表わす文字 列をとり、リスト値に展開し、その配列値を返します。 (スカラコンテキストでは、単に最初の値を返します。) TEMPLATE は、pack 関数と同じフォーマットを使います。 部分文字列を取り出すうサブルーティンの例を示します: sub substr { local($what,$where,$howmuch) = @_; unpack("x$where a$howmuch", $what); } そして、 sub ordinal { unpack("c",$_[0]); } # ord() と同じ ということもできます。 さらに、フィールドの前に %<数値> というものを付けて、 項目自身の代わりに、その項目の <数値>-ビットのチェッ クサムを計算させることができます。 デフォルトは、16- ビットチェックサムです。 たとえば、 while (<>) { $checksum += unpack("%16C*", $_); } $checksum %= 65536; は、System V の sum プログラムと同じ値を計算します。 また、 $setbits = unpack("%32b*", $selectmask); は、効率的に、ビットベクターの設定されているビットを 数えるものです。 untie VARIABLE 変数とパッケージの間の結合を解きます。 (tie() を参 照してください。) unshift ARRAY,LIST shift の逆操作を行ないます。 見方を変えれば、push の逆操作とも考えられます。 LIST を ARRAY の先頭に入 れて、新しくできた配列の要素の数を返します。 unshift(ARGV, '-e') unless $ARGV[0] =~ /^-/; LIST は、はらばらにではなく、一度に登録されるので、 順番はそのままです。 逆順に登録するには、reverse を 使ってください。 Perl manpages Last change: Release 5.0 Patchlevel 00 56 PERLFUNC(1) USER COMMANDS PERLFUNC(1) use Module LIST use Module 指定したモジュールから、現在のパッケージにさまざまな 内容をインポートします。 多くは、パッケージのサブル ーティン名や、変数名に別名を付けることで、実現されて います。 これは、 BEGIN { require Module; import Module LIST; } というのと、全く同値です。 名前空間を変更したくない 場合には、代わりに require を使ってください。 BEGIN によって、require や import は、コンパイル時に 実行されることになります。 require は、モジュールが まだ、メモリーにロードされていなければ、ロードします。 import は、組込みの関数ではなく、さまざまな機能を現 在のパッケージにインポートするように、"Module" パッ ケージに伝えるために呼ばれる、通常の静的メソッドです。 モジュール側では、import メソッドをどのようにでもイ ンプリメントすることができますが、多くのモジュールで は、Exporter モジュールで定義された、Exporter クラス からの継承によって、import メソッドを行なうようにし ています。 これは、広く公開されているインタフェースですので、プ ラグマ (コンパイラディレクティブ) は、この方法でイン プリメントされています。 現在インプリメントされてい るプラグマには、以下のものがあります: use integer; use sigtrap qw(SEGV BUS); use strict qw(subs vars refs); use subs qw(afunc blurfl); 通常のモジュールが、現在のパッケージにシンボルをイン ポートする (これは、ファイルの終わりまで有効です) の に対して、これらの擬似モジュールは、現在のブロックス コープにインポートを行ないます。 これに対して、"no" コマンドという、use によってイン ポートされたものを、インポートされていないことにする ものがあります。 no integer; no strict 'refs'; 標準モジュールやプラグマの一覧は、perlmod manpage を 参照してください。 Perl manpages Last change: Release 5.0 Patchlevel 00 57 PERLFUNC(1) USER COMMANDS PERLFUNC(1) utime LIST ファイルのアクセス時刻と修正時刻を変更します。 LIST の最初の 2 つの要素に、数値で表わしたアクセス時刻と 修正時刻を順に指定します。 LIST の残りの要素が、変 更の対象となるファイルです。 変更に成功したファイル の数を返します。 各ファイルの inode 修正時刻には、 その時点の時刻が設定されます。 "touch" コマンドの例 です: #!/usr/bin/perl $now = time; utime $now, $now, @ARGV; values ASSOC_ARRAY 指定した連想配列のすべての value からなる通常配列を 返します。 (スカラコンテキストでは、value の数を返 します。) 返される value の順序は、見た目にばらばら なものですが、同じ配列に対して、keys() 関数や each() 関数が返すものと同じ順序です。 keys() と each() も 参照してください。 vec EXPR,OFFSET,BITS 文字列 EXPR をunsigned int のベクターとして扱い、 OFFSET と BITS で指定されるビットフィールドの値を返 します。 左辺値として、代入の対象にすることもできま す。 BIT は、1 から 32 までの 2 のべきを値として使 うことができます (1, 2, 4, 8, 16, 32)。 vec() で作られたベクターは、論理演算子 |、&、^ で扱 うこともできます。 これらの演算子は、両方の被演算子 に文字列を使うと、ビットベクター演算を行ないます。 ビットベクターを、0 と 1 の文字列や配列に変換するに は、 $bits = unpack("b*", $vector); @bits = split(//, unpack("b*", $vector)); のようにします。 ビット長が分かっていれば、* の代わ りにその長さを使うことができます。 Perl manpages Last change: Release 5.0 Patchlevel 00 58 PERLFUNC(1) USER COMMANDS PERLFUNC(1) wait チャイルドプロセスが終了するのを待ち、消滅したプロセ スの pid を返します。 チャイルドプロセスが存在しな いときには、-1 を返します。 ステータスは $? に返さ れます。 waitpid PID,FLAGS 特定のチャイルドプロセスが終了するのを待ち、消滅した プロセスの pid を返します。 指定したチャイルドプロ セスが存在しないときには、-1 を返します。 ステータ スは $? に返されます。 use POSIX "wait_h"; ... waitpid(-1,&WNOHANG); とすると、ブロックが起こらないようにして、任意のプロ セスを wait します。 ブロックなしの wait は、システ ムコール waitpid(2) か、システムコール wait4(2) をサ ポートしているマシンでのみ利用可能です。 しかしなが ら、特定の pid を 0 の FLAGS での wait はどこでもイ ンプリメントされています。 (exit したプロセスのステ ータス値を覚えておいて、Perl がシステムコールをエミ ュレートしますが、Perl スクリプトには取り入れられて いません。) wantarray 現在実行中のサブルーティンがのコンテキストが、リスト 値を要求するものであれば、「真」を返します。 スカラ を要求するコンテキストであれば、「偽」を返します。 return wantarray ? () : undef; warn LIST die() と同じように STDERR にメッセージを出力しますが、 exit したり、例外を発生させたりしません。 Perl manpages Last change: Release 5.0 Patchlevel 00 59 PERLFUNC(1) USER COMMANDS PERLFUNC(1) write FILEHANDLE write EXPR write 指定されたファイルに対して、そのファイルに対応させた フォーマットを使って、(複数行の場合もある) 整形され たレコードを書き出します。 デフォルトでは、ファイル に対応するフォーマットは、ファイルハンドルと同じ名前 のものですが、その時点の出力チャネル (select() 関数 の項を参照) のフォーマットは、その名前を明示的に、変 数 $~ に代入することで、変更が可能です。 ページの先頭の処理は、自動的に行なわれます。 現在の ページに整形されたレコードを出力するだけのスペースが ない場合には、改ページを行なってページを進め、新しい ページヘッダを整形するため、ページ先頭フォーマットが 使われ、その後でレコードが書かれます。 デフォルトで は、ページ先頭フォーマットは、ファイルハンドルの名前 に "_TOP" をつなげたものですが、ファイルハンドルが選 択されている間に、変数 $^ に名前を設定すれば、動的に フォーマットを変更することができます。 そのページの 残り行数は、変数 $- に入っており、この変数を 0 に設 定することで、強制的に改ページを行なうことができます。 FILEHANDLE を指定しないと、出力はその時点のデフォル ト出力チャネルに対して行なわれます。 これは、スクリ プトの開始時点では STDOUT ですが、select() 演算子で 変更することができます。 FILEHANDLE が EXPR ならば、 式が評価され、その結果の文字列が実行時に FILEHANDLE の名前として見られます。 フォーマットについて、さら には、perlform manpage を参照してください。 残念ながら、write は read の反対のことをするものでは ありません。 y/// 変換演算子。 perlop manpage の tr/// の節を参照して ください。 Perl manpages Last change: Release 5.0 Patchlevel 00 60