とほほのperl入門(リファレンス編)

トップ > とほほのperl入門 > リファレンス編

プログラム制御

if - 条件分岐する(もし・・・ならば)
else - 条件分岐する(さもなくば)
elsif - 条件分岐する(あるいは・・・ならば)
unless - 条件分岐する(もし・・・でなければ)
while - 繰り返す(・・・のあいだ)
for - 繰り返す(・・・から・・・のあいだ)
foreach - 繰り返す(配列の全要素に対して)
last - ループを抜ける
next - 次のループを繰り返す
redo - 今のループを繰り返す
goto - ジャンプする
do - 処理を実行する
eval - 処理を実行する
exit - スクリプトを終了する
die - スクリプトを終了する
dump - コアダンプする

サブルーチン・パッケージ・ライブラリ

sub - サブルーチンを定義する
return - サブルーチンから戻る
caller - サブルーチンの情報を返す
package - パッケージを開始する
require - ライブラリファイルを読み込む

ファイル入出力

open - ファイルをオープンする
close - ファイルをクローズする
read - ファイルからデータを読み出す
write - フォーマット付きの出力を行う
sysread - ファイルから直接読み込む
syswrite - ファイルへ直接書き込む
eof - ファイルの終端を判断する
stat - ファイルの属性を得る
lstat - ファイルの属性を得る
binmode - バイナリモードで読み書きする
fileno - ファイルディスクリプタを得る
flock - ファイルをロックする
getc - ファイルから1文字読み込む
seek - ファイルの読み込み・書き込み位置を変更する
tell - ファイルの読み込み・書き込み位置を得る
truncate - ファイルサイズを変更する
print - ファイルへ書き出す
printf - ファイルへフォーマット付きで書き出す
select - 未稿
fcntl - 未稿
ioctl - 未稿

ファイル操作

chmod - ファイルのモードを変更する
chown - ファイルのオーナーを変更する
rename - ファイル名を変更する
unlink - ファイルを削除する
utime - ファイルの時刻を変更する
link - リンクファイルを作成する
symlink - シンボリックリンクを作成する
readlink - シンボリックリンク数を得る

ディレクトリ操作

chdir - カレントディレクトリを変更する
chroot - ルートディレクトリを変更する
mkdir - ディレクトリを作成する
rmdir - ディレクトリを削除する

ディレクトリ読み出し

opendir - ディレクトリをオープンする
closedir - ディレクトリをクローズする
readdir - ディレクトリエントリを読み出す
rewinddir - 最初から読むようにする
telldir - 現在の位置を得る
seekdir - 現在の位置を変更する

文字列操作

length - 文字列長を得る
substr - 文字列の一部を取り出す
join - 複数の文字列を連結する
split - 文字列を分割する
index - 文字列の中から特定文字を探す
rindex - 文字列の中から特定文字を探す
sprintf - 値をフォーマッティングする
chop - 行末の1文字を削除する chomp - 行末の改行コードを削除する m/pattern/gio
/pattern/gio
q/string/
qq/string/
qx/string/
s/pattern/replacement/gieo
tr/pattern/replacement/cds
y/pattern/replacement/cds

時刻操作

time - 現在の時刻を得る
localtime - 時刻を得る
gmtime - 時刻を得る

配列制御

pop - 最後の要素を取り出す
push - 要素を最後に追加する
shift - 最初の要素を取り出す
unshift - 要素を最初に追加する
sort - 配列をソートする
grep - パターンマッチした要素を取り出す
reverse - 配列要素を逆順にする
splice - 配列要素を部分削除(置換)する

連想配列制御

delete - 連想配列変数を削除する
each - 連想配列の全要素を処理する
keys - 連想配列のキーの一覧を得る
values - 連想配列の値の一覧を得る

数学関数

atan2 - atan y/x
sin - sin x
cos - cos x
exp - eのn乗
sqrt - ルート
int - 整数値
log - log x
rand - 乱数
srand - 乱数を初期化する

データ変換

ord - 文字のASCIIコードを得る
oct - 8進数や16進数を解釈する
hex - 16進数を解釈する
pack - バイナリデータを生成する
unpack - バイナリデータを解釈する
scalar - スカラー値に変換する
vec - ビットフィールドを取り出す

プロセス制御

fork - 子プロセスを生成する
wait - 未稿
waitpid - 未稿

シグナル

alarm - アラームシグナルを発行する
kill - SIGKILLを送る

ソケット

socket - ソケットを作成する
socketpair - 未稿
bind - ソケットに名前をつける
listen - 未稿
connect - 未稿
recv - 未稿
send - 未稿
shutdown - 未稿
getpeername - 未稿
getsockname - 未稿
getsockopt - 未稿
setsockopt - 未稿
gethostbyname - ホスト名からIPアドレスを得る
getnetbyname - 未稿
getprotobyname - 未稿
getservbyname - 未稿
gethostbyaddr - IPアドレスからホスト名を得る
gethostent - 未稿
gethostent - 未稿
endhostent - 未稿
getnetent - 未稿
setnetent - 未稿
endnetent - 未稿
getprotoent - 未稿
setprotoent - 未稿
endprotoent - 未稿
getservent - 未稿
setservent - 未稿
endservent - 未稿

メッセージ

msgctl - 未稿
msgget - 未稿
msgsnd - 未稿
msgrcv - 未稿

セマフォ

semctl - 未稿
semget - 未稿
semop - 未稿

共有メモリ

shmctl - 未稿
shmget - 未稿
shmread - 未稿
shmwrite - 未稿

データベース

dbmopen - 未稿
dbmclose - 未稿

その他

crypt - パスワードをチェックする
defined - 定義されているか調べる
system - 外部コマンドを実行する
exec - 外部コマンドを実行する
local - ローカル変数を定義する
sleep - 数秒間待つ
undef - 変数などを未定義の状態にする
warn - エラーメッセージを出力する
wantarray - サブルーチンのコンテキストを調べる
study - 未稿
syscall - 未稿
umask - 未稿
pipe - 未稿
reset - 未稿
getlogin - 未稿
getpgrp - 未稿
setpgrp - 未稿
getppid - 未稿
getpriority - 未稿
setpriority - 未稿
getpwnam - 未稿
getgrnam - 未稿
getpwuid - 未稿
getgrgid - 未稿
getpwent - 未稿
setpwent - 未稿
endpwent - 未稿
getgrent - 未稿
setgrent - 未稿
endgrent - 未稿

リファレンス

alarm(expr)

expr 秒後にアラームシグナル(SIGALRM)を発行する。SIGALRM は、$SIG{'ALRM'}="関数名"; で捕獲する。再設定したり expr に 0 を指定すると、以前の設定はキャンセルされ、以前の設定の残り時間が返される。OS によってはサポートされていない。

$SIG{'ALRM'} = "sigalrm";
sub sigalrm { print "ALARM!!\n"; }
alarm(5);
atan2(y, x)

y/x のアークタンジェントの値、つまり、原点から見た、座標 x, y の角度をラジアン単位(-π~π )で返す。

bind(SOCKET, name)

ソケットに名前をつける。→ socket 参照。

binmode(FILEHANDLE)

FILEHANDLE の入出力をバイナリモードで行うようにする。UNIX では意味が無いが、Windows ではバイナリファイルを読み書きする際にはバイナリモードにしなくてはならない。さもないと、改行コード変換(CR LF ←→ LF)が行われてしまい、バイナリデータが破損してしまう。

caller(expr)
◆ caller()

サブルーチンを呼び出した側のパッケージ名、ファイル名、行番号を得る。

func()

sub func {
    ($package, $filename, $line) = caller;
    print "$package, $filename, $line\n";
}
chdir(dirname)

カレントディレクトリ(作業フォルダ)を変更する。カレントディレクトリはプロセスが終了するまで有効で、子プロセス起動時は子プロセスに引き継がれる。区切り文字は \ よりも / を使用するのが無難。

chdir("C:/Temp");
chmod(mode, filelist)

filelist で指定したファイル(複数指定可)のパーミッションを変更する。変更が成功したファイルの個数を返す。

chomp(list)

行末の改行コードを削除する。具体的には、行末のレコードセパレータ $/ にマッチする部分を削除するので、chop に比べて安全性は高い。Perl 5 からサポート。

chop(list)
◆ chop(string)
◆ chop()

文字列の最後の文字を削除して、その文字列を返す。文字列を配列で与えた場合はすべての文字列の最後の文字を削除し、最後の文字列の結果を返す。<FILEHANDLE> で読み込んだデータ末尾の改行コード(\n)を削るのに便利だが、\r\n の時でも \n しか削らないので注意。引数省略時は chop($_) と同じ。→ chomp

chown(uid, gid, filelist)

filelist(配列指定可能)で指定したファイルのオーナーユーザーとオーナーグループを変更する。uid, gid にはそれぞれユーザーIDとグループIDを指定する。変更に成功したファイルの個数を返す。

chroot(dirname)

このプロセスにおけるルートディレクトリを変更する。

close(FILEHANDLE)

open() でオープンしたファイルハンドルをクローズする。スクリプトが終了する時にはファイルは自動的にクローズされるが、オープンしたファイルは使い終わったらクローズするのがお作法。

closedir(DIRHANDLE)

opendir() でオープンしたディレクトリハンドルをクローズする。

◆ connect(SOCKET, name)

→ socket 参照。

cos(expr)
◆ cos()

数学関数 cos(expr) の値をラジアン単位で返す。expr 省略時は cos($_) と同じ。

crypt(passwd, salt)

利用者のパスワードをファイルに保存する際、そのまま保存しておくと危険なので、crypt() で DES による暗号化を行ってから保存するとよい。暗号化したパスワードから元のパスワードを解読することは困難だが、元のパスワードをチェックすることは容易にできる。解読を困難にするために、salt にはドット(.)、スラッシュ(/)を含む2文字の英数文字をランダムに指定する。この2文字は暗号化されたパスワードの最初の2文字となる。2文字目より後ろは無視される。

# パスワードを "hi.mi.tu" とする
$passwd = "hi.mi.tu";

# 暗号化したパスワード($epasswd)を得る
srand();
@salts = ( "A".."Z", "a".."z", "0".."9", ".", "/" );
$salt = $salts[int(rand(64))] . $salts[int(rand(64))];
$epasswd = crypt($passwd, $salt);
print "epasswd=$epasswd\n";

# 暗号化したパスワードでパスワードをチェックする
$passwd = "hi.mi.tu";
$epasswd = "ZpoK9sz7yGHRo";
if ($epasswd eq crypt($passwd, $epasswd)) {
    print "Match!!\n";
}

MD5 がサポートされているシステムでは、salt に、"$1$" で始まる 8文字($1$ を含めて11文字)を指定することにより、MD5 を使用できる。DES よりも安全度が高い。

◆ dbmclose(assoc_array)

未稿。

◆ dbmopen(assoc_array, dbname, mode)

未稿。

defined(expr)

変数、配列、サブルーチンが定義されているかどうかを調べ、真または偽を返す。値がヌル文字(または0、または空配列)なのか、それとも定義されていないのかを調べる事ができる。いくつかの関数もundefineの値を返す事がある。

defined($xx)              # 偽を返す
$xx = ""; defined($xx)    # 真を返す
$xx = 0; defined($xx)     # 真を返す
delete $assoc_array{key}

指定した連想配列を削除、つまり、undefine の状態にする。

die(list)

perl スクリプトを終了する。list を STDERR に出力し、$! の値(もし $! が 0 なら($?>>8) の値)を perl スクリプトの戻り値とする。eval の中で使用した場合はスクリプトを終了せず、list を $@ に設定し、eval が undefine で終了する。list の末尾に改行が無い場合は、スクリプト名や行番号などが末尾に付加される。

open(IN, $file) || die "Can't open file.\n";
open(IN, $file) || die "Can't open file. Stopped";
do { ... }
◆ do subroutine (list)
◆ do expr

... や Ssubroutine を実行する。次の例では最後の式の値が do の戻り値となる。

$xx = do { $yy = 5; $zz = 8; }  # 戻り値は最後の式の値

次の例ではサブルーチン do を呼び出して戻り値を返す。(ただし、&add(5, 3) を用いるのが一般的。)

sub add { return($_[0] + $_[1]); }
print do add(5, 3);

次の例では libfile.pl という外部ファイルを perl のライブラリとして呼び出す。(ただし、require "libfile.pl"; を用いるのが一般的。)

do "libfile.pl";

do を用いて、if文、unless文、while文、until文の順序を変更することができる。

do { print "5です。\n"; } if ($xx == 5);
do { print "xx = $xx\n"; $xx++; } while ($xx < 5);
dump label

直ちにコアダンプしてスクリプトを終了する。undump コマンドでコアファイルから実行ファイルを生成して再実行すると、label の場所から実行される。変数の内容はダンプ前の状態が保存されるので、初期化処理をスキップした高速起動コマンドを生成できるが、ファイルディスクリプタは保存されない。

each(assoc_array)

連想配列のすべての要素について処理を行う。

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

if と組み合わせて「さもなくば」の処理を行う。

if ($xx == 5) {
    print "5です。\n";
} else {
    print "5ではありません。\n";
}
elsif

if と組み合わせて「あるいは」の処理を行う。

if ($xx == 5) {
    print "5です。\n";
} elsif ($xx == 6) {
    print "6です。\n";
} elsif ($xx == 7) {
    print "7です。\n";
} else {
    print "5でも6でも7でもありません。\n";
}
eof(FILEHANDLE)
◆ eof()

FILEHANDLE がオープンされていないか、オープンされているがファイルの終端に達している場合に 1 を返す。eof() とした場合はコマンドラインで指定したすべてのファイルが終端に達した場合に、eof() とした場合は最後に読み込んだファイルが終端に達した場合に 1 を返す。

eval(expr)
◆ eval { ... }

expr の値や ... を perl のスクリプトとみなして実行する。最後に実行した命令の結果が戻り値として返される。perl がエラーメッセージを出して終了するような命令や、die が実行された場合、undefine を返し、$@にエラーメッセージを格納する。dbmopen, symlink, flock など、実装されているかどうか分からない命令や、0除算の可能性のある割り算を行う際に、eval を用いて perl が異常終了するのを防ぐ事ができる。(eval { ... }; のセミコロン( ; )に注意)

print eval("3 * (5 + 3)") . "\n";

$x = 10; $y = 0;
$ans = eval { $x / $y; };
if ($@) { warn "WARNING: $@"; }

open(OUT, "> xx");
eval { flock(OUT, 2); };
if ($@) { warn "WARNING: flock isn't supported.\n"; }
exec(list)

list で指定した外部コマンドに処理を移す。system() と異なり、exec() を呼び出した以降のスクリプトは実行されない。出力がバッファリングされてしまうことがあるので、$| = 1; としておくことを奨める。

exit(expr)

perl スクリプトを終了する。終了コードとして expr の値を返す。通常、成功終了は 0、異常終了は 0 以外の値を返す。expr 省略時は 0 を返す。

exp(expr)
◆ exp()

e の expr 乗を返す。expr 省略時はexp($_) と同じ。

fcntl(FILEHANDLE, function, scalar)

fileno(FILEHANDLE)

FILEHANDLE で示されるファイルのファイルディスクリプタを返す。これは select() などで用いられる。

flock(FILEHANDLE, operation)

他のプロセスが書込み中のファイルを読み込むと、不完全なデータを読み込んでしまい、それを書き戻した時点でファイルが破壊されることがある。これを防ぐためにflock() を用いてファイルをロック(排他制御)する。operation には次の値のいずれかを指定する。(まれに、数値の異なるシステムもあるかも)

1   読み込み宣言ロック(ブロックモード)
2   書き込み宣言ロック(ブロックモード)
5   読み込み宣言ロック(非ブロックモード)
6   書き込み宣言ロック(非ブロックモード)
8   ロック解除(アンロック)

読み込み宣言ロックは「今から私が読み込むから、他の誰も書き込むな」という宣言であり、書き込み宣言ロックは「今から私が書き込むから、他の誰も読み込んだり書き込んだりするな」という宣言である。ただし、書き込みを禁止すると言っても、flock() を使用していないプロセスの書き込みまで禁止できる訳ではない。ブロックモードでは、自分がロックをかけることができる状態になるまでプログラムが一時停止する。非ブロックモードでは、自分がロックをかけることができたか、できなかったらすぐに真または偽を返す。flock() をサポートしていないシステムもあり、無理に使用すると perl が異常終了する。汎用性のあるプログラムを記述する場合は eval を使用するとよい。

下記の例は2つの誤りを犯している。

open(OUT, "> outfile.txt");
flock(OUT, 2);
print OUT "........";
flock(OUT, 8);
close(OUT);

ひとつ目は open() を行った時点で、ロックを行うよりも前にファイルサイズを 0 にしてしまう点。ふたつ目は、print による書き込みキャッシュがフラッシュされる前に flock(OUT, 8) でロックを解除してしまっている点である。上記のコードは次のように書かなくてはならない。close() を行った時やプログラムが終了する時には自動的にロックは解除される。(ただし、2つ目の問題は最近の perl では改善されている)

open(OUT, "+< outfile.txt");
flock(OUT, 2);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT "........";
close(OUT);
for (expr1; expr2; expr3) { statements }
◆ for (list) { statement }
◆ for (from .. to) { statement }

まず expr1 を実行し、その後、expr3 を行いながら expr2 が真の間 statements を実行する。次の例はいずれも、10回ループを実行する例である。

for ($xx = 1; $xx <= 10; $xx++) {
    print "xx = $xx\n";
}
for (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) {
    print "xx = $xx\n";
}
for (1..10) {
    print "xx = $xx\n";
}
foreach var (array) { statements }
◆ foreach (array) { statements }

配列の各要素に対して処理を行う。foreach の代わりに for を使うこともその逆も可能だが、配列操作の場合は foreach を用いるのが一般的。

@zz = (11, 22, 33, 44, 55);
foreach $xx (@zz) {
    print "xx = $xx\n";
}

$xx を省略した場合は、省略時変数 $_ が用いられる。

foreach (@zz) {
    print "xx = $_\n";
}
fork()

子プロセスを生成し、親プロセスと子プロセスに分岐する。親プロセスの場合 $pid には子プロセスのIDが、子プロセスの場合、$pid には 0 が返る。fork() をサポートしていないシステムもあり、無理に使用すると perl が異常終了する。

if ($pid = fork()) {
    print "これは親プロセスです。\n";
} else {
    print "これは子プロセスです。\n";
}
getc(FILEHANDLE)
◆ getc()

FILEHANDLE から 1文字読み込む。FILEHANDLE 省略時は標準入力 STDIN から読み込む。ファイルの終端に達するとヌル文字を返す。

while ($c = getc(IN)) { print $c; }
◆ getlogin()
◆ getpeername(SOCKET)
◆ getpgrp(pid)
◆ getppid()
◆ getpriority(which, who)
◆ getpwnam(name)
◆ getgrnam(name)
gethostbyname(name)

詳細説明は省略するが、DNS を用いてホスト名をIPアドレスに変換することができる。

$addr = (gethostbyname($host))[4];
$addr = sprintf("%u.%u.%u.%u", unpack("C*", $addr));
◆ getnetbyname(name)
◆ getprotobyname(name)
◆ getpwuid(uid)
◆ getgrgid(gid)
◆ getservbyname(name, proto)
gethostbyaddr(addr, addrtype)

詳細説明は省略するが、DNS を用いてIPアドレスからホスト名を求めることができる。

$addr = "127.0.0.1";
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
◆ 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()
◆ getsockname(SOCKET)
◆ getsockopt(SOCKET, level, optname)
gmtime(expr)

localtime と同様だが、グリニッジ標準時の値を返す点が異なる。

goto label

label の場所にジャンプする。label はラベル名にコロン(:)をつけて宣言し、コロン無しのラベル名を指定してジャンプする。

grep(expr, list)

配列から、パターンにマッチした要素を取り出す。次の例は、配列 @lines の中から "#include" で始まるものの配列を抜き出す。

@result = grep(/^#include/, @lines);
hex(expr)

expr を 16進数の文字列と解釈してその値を返す。expr 省略時は hex($_) と同様。

$ans = hex("FF");
if (expr) { statements }

expr が真であれば statements を実行する。

if ($xx > 5) {
    print "5より大きい\n";
}
index(str, substr, position)
◆ index(str, substr)

文字列の中から特定の文字列を探す。文字列 strposition 番目(省略時は最初)から後方に substr を探していき、最初に現れる位置を返す。

index("ABCDEFG", "DEF");   # 3を返す
int(expr)
◆ int()

expr の整数部を返す。expr 省略時は int($_) と同じ。

ioctl(FILEHANDLE, function, scalar)
join(expr, list)
◆ join(expr, array)

array で与えられる文字列を expr の値で区切りながら連結する。

$now = join(":", $hour, $min, $sec);
keys(assoc_array)

指定された連想配列のすべてのキーの一覧を配列で返す。

kill(sig, list)
◆ kill sig, list

list で示すプロセスに SIGKILL シグナルを送る。詳細は UNIX のシステムコールマニュアルを参照。

last label
◆ last

最も内側のループを抜ける。label が指定されていればラベル名のループを抜ける。

aaa: while (<IN>) {
        if (/^end/) last aaa;
    }
length(expr)
◆ length

expr で与えられる文字列の長さを返す。expr 省略時は length($_) と同じ。

link(oldfile, newfile)

ファイルをリンクする。リンクされたファイルは実態が同じで、複数のパス名を持つファイルとなる。oldfile に既存のファイル名、newfile に新規作成する新ファイル名を指定する。成功時は 1、失敗時は 0 を返す。

◆ listen(SOCKET, queuesize)

local(list)

サブルーチン、eval、do の中でローカルな変数を定義する。下記の例は 3 が表示されるが、local 文を削除すると 5 が表示される。

sub xxx { local($a); $a = 5 }
$a = 3; &xxx; print $a;
localtime(expr)

time() や stat() で得られた時刻を地方時間帯の年月日時分秒などに分解する。

($sec, $min, $hour, $mday, $mon, $year,
    $wday, $yday, $isdst) = localtime($tt);

$sec, $min, ...はそれぞれ、秒数(0-59)、分(0-59)、時(0-23)、日(1-31)、月(0-11)、年(1900年からの年数(西暦の下2桁ではない))、曜日(日(0)-土(6))、年日数(1月1日を0とする)、$isdst(夏時間なら0以外の値)を表わす。

log(expr)
◆ log

e を基とする expr の log を返す。expr 省略時は log($_) と同じ。

lstat(FILEHANDLE)
◆ lstat(expr)
◆ lstat scalar

stat() と同様だが、シンボリックリンクファイルの際、リンク先のファイルではなく、シンボリックリンクファイル自体の情報を得る。

◆ m/pattern/gio

◆ /pattern/gio

mkdir(dirname, mode)

ディレクトリを作成する。mode にはディレクトリのパーミッション(通常 0755)を指定する。成功時は 1 を返す。失敗時は 0 を返し、$! が設定される。

◆ msgctl(id, cmd, arc)

◆ msgget(key, flags)

◆ msgsnd(id, msg, flags)

◆ msgrcv(id, var, size, type, flags)

next label
◆ next

最も内側、もしくは label で指定したループの次の繰り返しを実行する。

aaa: while (<IN>) {
        if (/^#/) { next aaa; }
    }
oct(expr)
◆ oct()

expr が、0x で始まっていれば 16進数として、それ以外なら 8進数だと解釈してその値を返す。次の例は、C言語の構文と同様に、0x で始まっていれば 16進数、0で始まっていれば8進数、それ以外なら10進数と解釈する。

$ans = ($xx =~ /^0/) ? oct($xx) : $xx;
open(FILEHANDLE, expr)
◆ open(FILEHANDLE)

ファイルやコマンドをオープンし、ファイルハンドルを得る。成功すれば非 0 を、失敗すれば undefine を返す。expr を省略した場合は、FILEHANDLE と同じ名前の変数の値が expr とみなされる。指定するファイル名には http://~ などの URL は指定できないので注意。

ファイルを読み込みモードでオープンする。

open(IN, "xxx.txt");
while (<IN>) { print; }
close(IN);

ファイルを書込みモードでオープンする。

open(OUT, "> xxx.txt");
print OUT "らくがき";
close(OUT);

ファイルを読み書きモードでオープンする。オープン時ファイルを空にする。

open(F, "+> xxx.txt");
print F "やっほ";
seek(F, 0, 0);
$msg = <F>;
close(F);

ファイルを読み書きモードでオープンする。オープン時ファイルの内容はそのまま。

open(F, "+< xxx.txt");
$count = <F>;
$count++;
seek(F, 0, 0);
print F $count;
close(F);

ファイルを追加書込みモードでオープンする。

open(OUT, ">> xxx.txt");
print OUT "らくがき";
close(OUT);

外部コマンドを起動し、その結果を読み込む。

open(IN, "cat xxx.txt | nkf -j |");
while(<IN>) { print; }
close(IN);

外部コマンドを起動し、出力を渡す。

open(OUT, "| nkf -j | /usr/lib/sendmail $mailto");
print OUT "らくがき";
close(OUT);

書き込み時、バッファリングしないようにする。

open(OUT, "> xxx.txt");
$old = select(OUT); $| = 1; select($old);
opendir(DIRHANDLE, expr)

ディレクトリ内のファイル一覧を得るためにディレクトリをオープンし、ディレクトリハンドルを得る。

opendir(DIR, "tmp");
while ($file = readdir(DIR)) { print "$file\n"; }
closedir(DIR);
ord(expr)
◆ ord()

expr の最初の文字の ASCII コードを数値で返す。expr 省略時は $_ を見る。例えば ord("A") は 65、ord("B") は 66 を返す。

pack(template, list)

バイナリデータを生成する。templatelist がどんな形式のデータなのかを指定する。後ろに数値を付けるとその個数分、アスタリスク(*)をつけると list の最後まで、バイナリデータに変換する。

a  ASCII string(ヌル文字が補完される)
A  ASCII string(スペースが補完される)
b  bit string(昇順ビットオーダ)
B  bit string(降順ビットオーダ)
h  hex string(low nybble first)
H  hex string(high nybble first)
c  符号付き1バイト数値(-128 ~ 127)
C  符号無し1バイト数値(0~255)
s  符号付きshort数値(通常2バイト)
S  符号無しshort数値(通常2バイト)
i  符号付きint数値(通常4バイト)
I  符号無しint数値(通常4バイト)
l  符号付きlong数値(通常4バイト)
L  符号無しlong数値(通常4バイト)
n  short数値(ネットワークバイトオーダ)
N  long数値(ネットワークバイトオーダ)
x  ヌル文字
X  back up a byte
f  単精度浮動小数点
d  倍精度浮動小数点
p  文字列へのポインタ
u  uuencodeされた文字列
@  絶対位置までヌル文字を埋める

例えば次のように使用する。

pack("C*", 0x41, 0x42, 0x43); # 0x41 0x42 0x43
pack("b*", "10101010"); # 0x55
pack("a5", "abc"); # 0x41 0x42 0x43 0x00 0x00
package packagename

これ以降(ファイルの終わりか次の package が現れるまで)のスクリプトを packagename で示すパッケージとして扱うことを宣言する。パッケージの内部では独自の変数名やサブルーチン名を持てるので、パッケージの内部と外部でたまたま変数名などが重複することによる悲劇を防ぐことができる。パッケージ内の変数やサブルーチン名は「パッケージ名'変数名」で指定する。

print &calc'add(3, 5);
package calc;
sub add { return($_[0] + $_[1]); }
◆ pipe(READHANDLE, WRITEHANDLE)

pop(array)

配列の最後の要素を取り出す。取り出された要素は配列から削除される。配列に要素が無い場合は undefine を返す。

print(FILEHANDLE list)
◆ print(list)
◆ print FILEHANDLE list
◆ print list
◆ print

ファイルに文字列や変数の値を書き出す。FILEHANDLE を省略すると標準出力(STDOUT)に書き出す。list を省略すると $_ を書き出す。

printf(FILEHANDLE format, list)
◆ printf(format, list)
◆ printf FILEHANDLE format, list
◆ printf format list

ファイルに文字列や変数の値をフォーマット付きで書き出す。format には書き出す文字列を指定するが、「パーセント(%)+なんとか」は続く list のそれぞれの要素の値に変換される。例えば、%s は文字列に、%d は整数値、%f は小数に変換される。%10s や %10d はそれぞれ、10文字分の文字列、数値を表わす。%-10s や %-10d は右揃えで表示する。「バックスラッシュ( \ )+文字」は特殊文字として判断され、改行( \n )、タブ( \t )、復帰( \r )などと判断される。

printf("Name=%s, Age=%d\n", $name, $age);
push(array, list)

配列の最後に要素(配列指定可能)を追加する。arraylist が追加される。

◆ q/string/

◆ qq/string/

◆ qx/string/

rand(expr)
◆ rand()

0以上、expr 未満のランダムな値(小数付き)を返す。expr 省略時は rand(1) と同じ。下記の例は、0 以上 10 未満の乱数を得る。古いバージョンの perl では、srand による乱数の初期化が必要。

$xx = int(rand(10));
read(FILEHANDLE, scalar, length, offset)
◆ read(FILEHANDLE, scalar, length)

ファイルハンドルから length バイト分のデータを読み出して scalar に格納する。offset を指定すると読み出したデータを scalaroffset バイト目から格納する。成功時は読み出したバイト数を、失敗時は undefine を返す。バイナリデータを読み出す際に便利だが、MS-DOS や Windows などでは binmode を使用しなくてはならない場合がある。テキストファイルを読み込むのであれば、read ではなく、<FILEHANDLE> の形式を用いるのが一般的。

readdir(DIRHANDLE)

ディレクトリ内のエントリ(ファイルやディレクトリなど)の一覧を得る。スカラー変数に代入する時は次のエントリを、配列変数に代入する時は残りのエントリの一覧を返す。これ以上エントリが無い場合は undefine(配列の場合はヌルリスト)を返す。

readlink(filename)

シンボリックリンクの個数を得る。サポートされていないプラットフォームでは致命的エラーとなる。

◆ recv(SOCKET, scalar, length, flags)

redo LABEL
◆ redo

最も内側、もしくは LABEL で指定したループをもう一度繰り返す。

rename(OLDNAME, NEWNAME)

ファイル名を変更する。成功すれば 1 を、失敗すれば 0 を返す。

require(expr)
◆ require expr
◆ require

ライブラリファイルを読み込む。ライブラリファイルは習慣的に .pl の拡張子を持つ perl スクリプトである。expr を省略した場合は $_ をファイル名とみなす。

require "jcode.pl";
◆ reset(expr)
◆ reset

return list

サブルーチンを終了する。list をサブルーチンの戻り値とする。return 文を省略すると、最も最後の式の値が戻り値となる。

sub add { return($_[0] + $_[1]); }
reverse(list)

配列(または文字列)を逆順に並び替えたものを返す。結果を配列として扱うか、スカラーとして扱うかで動作が異なる。

@ans = reverse("abc", "def"); # ( "def", "abc" )が返される
$ans = reverse("abc", "def"); # "cba"が返される。
rewinddir(DIRHANDLE)

readdir() で最初から読み込めるようにする。

rindex(string, substr, position)
◆ rindex(string, substr)

index() と同様。文字列の後ろから探す点が異なる。

rmdir(filename)
◆ rmdir

ディレクトリを削除する。成功時は 1 を返す。失敗時は 0 を返し、$! を設定する。filename を省略すると $_ を参照する。

◆ s/pattern/replacement/gieo

scalar(expr)

expr で指定した値をスカラー値に変換して返す。

seek(FILEHANDLE, pos, whence)

ファイルの読み込み・書き込み位置を変更する。whence が 0 の時はファイルの先頭から pos バイト目に、whence が 1 の時は現在の位置から pos バイト移動した場所(負の数も指定可能)に、whence が 2 の時はファイルの終わりから pos バイト目に移動する。成功すれば 1、さもなくば 0 を返す。(whenceの数値はシステムによって異なる場合がある?)open(OUT, ">> file.txt") のように、追加モードで開いたファイルの書き込み位置は、開いた時点でのファイルの終端より前に移動させることができない。この場合、open(OUT, "+< file.txt") を用いるとよい。

seekdir(DIRHANDLE, pos)

readdirで読み込むディレクトリ位置を変更する。pos には telldir() が返す値を指定する。

◆ select(FILEHANDLE)
◆ select
◆ select(rbits, wbits, ebits, timeout)

◆ semctl(id, semnum, cmd, arg)
◆ semget(key, nsems, size, flags)
◆ semop(key, string)

セマフォ関連関数。詳細は UNIX のマニュアル参照。

◆ send(SOCKET, msg, flags, to)
◆ send(SOCKET, msg, flags)

◆ setpgrp(pid, pgrp)

◆ setpriority(which, who, priority)

◆ setsockopt(SOCKET, lebel, optname, optval)

shift(array)
◆ shift()

配列の最初の要素を取り出す。取り出された要素は配列から削除される。配列に要素が無い場合は undefine を返す。

◆ shmctl(id, cmd, arg)
◆ shmget(key, size, flags)
◆ shmread(id, var, pos, size)
◆ shmwrite(id, string, pos, size)

共有メモリ関連関数。詳細は UNIX のマニュアル参照。

◆ shutdown(SOCKET, how)

sin(expr)
◆ sin()

expr の sin 値をラジアン単位で返す。expr 省略時は sin($_) と同じ。

sleep(expr)
◆ sleep()

expr 秒間処理を中断して待つ。expr を省略すると SIGALRM が発生するまで待ち、実際にまった秒数を返す。

socket(SOCKET, domain, type, protocol)

ネットワーク通信のためのソケットを作成する。次のようにして、WWWサーバーから http://www.xxx.zzz/index.html を簡単に読み取ることができる。ただし、socket() の引数の 2, 1, 0 は、OS によっては 2, 2, 0 だったりすることもあるので注意。

$addr = (gethostbyname("www.xxx.zzz"))[4];
$name = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name);
binmode(S);
select(S); $| = 1; select(stdout);
print S "GET /index.html HTTP/1.0\r\n\r\n";
while (<S>) { print; }
close(S);
◆ socketpair(SOCKET1, SOCKET2, domain, type, protocol)

sort(list)
◆ sort(subroutine list)
◆ sort { ... } list

配列の各要素をソートした結果を返す。引数で指定した配列は変更されない。以下の3パターンの使用方法がある。

sub sortfunc { $a <=> $b }
@result = sort @list;
@result = sort sortfunc @list;
@result = sort { $a <=> $b } @list;

この場合の sortfunc(名前は任意) などをソート関数とよぶ。ソート関数には比較要素が $a, $b という名前で渡される。結果として正、0、負のいずれかで返すようにする。

splice(array, offset, length, list)
◆ splice(array, offset, length)
◆ splice(array, offset)

配列要素を部分削除(置換)する。array のうち、offset 番目から length 個の要素を list で置き換える。offset は 0 から始まる。list 省略時は削除する。length 省略時は offset 番以降すべてが対象となる。

split(/pattern/, expr, limit)
◆ split(/pattern/, expr)
◆ split(/pattern/)
◆ split

文字列を区切り文字で分割する。正規表現 /pattern/ にマッチする部分を区切り文字として、exprで 与えられる文字列を limit を超えない範囲の個数に分割し、その配列を返す。limit を省略した場合は個数の制限が無い。expr を省略した場合は $_ を分割する。/pattern/ を省略した場合はホワイトスペース(ひとつ以上の空白、タブ、または改行)で分割する。

@hhmmss = split(/:/, "12:34:56");
sprintf(format, list)

printf() と同様のフォーマットを行うが、ファイルへの書き出しは行わず、結果を文字列として返す。次の例は数値を文字列に変換する。

$str = sprintf("%d", $number);
sqrt(expr)
◆ sqrt()

expr の平方根を返す。expr 省略時は sqrt($_) と同じ。

srand(expr)

randの種を与える。 rand() は乱数を返すとは言っているが、プログラム起動後は常に同じパターンの値を返す。このパターンの始まりを変更するために、プログラムの先頭で srand を呼び出して無意味な値を指定してやる。ただし、Perl 5.004 以降は rand() 呼び出し時に srand() が自動的に呼び出されるので、不要。expr 省略時は srand(time) と同じ。

stat(FILEHANDLE)
◆ stat(expr)
◆ stat scalar

ファイルのサイズや作成日付などを調べる。

($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
    $atime, $mtime, $ctime, $blksize, $blocks) = stat($file);

返却値はそれぞれ、$dev(デバイス番号)、$ino(iノード番号)、$mode(パーミッションモード)、$nlink(リンク数)、$uid(作成者のユーザID)、$gid(作成者のグループID)、$rdev(???)、$size(バイト数)、$atime(最終アクセス時刻)、$mtime(最終更新時刻)、$ctime(作成時刻)、$blksize(ブロックサイズ)、$blocks(ブロック数)を意味する。最終更新時刻を知りたい場合は次のようにするとよい。

($mtime) = (stat($file))[9];

expr にアンダーバー(_)を指定すると、最後に実行した stat() の結果をそのまま返す。これは速度改善に役立つ。

◆ study(scalar)
◆ study

sub funcname { ... }

サブルーチンを定義する。

sub add {
    return($_[0] + $_[1]);
}
print &add(5, 6);
substr(expr, offset, length)
◆ substr(expr, offset)

文字列の一部を取り出す。expr で与えられる文字列のうち offset 文字から length 文字分を返す。最初の文字は通常 0 文字目だが、$[ により変化する。offset が負の値の時は $[ に関わらず、文字列の最後から -offset 文字目(最後の文字は1文字目)から後ろ方向に length 文字分を返す。length を省略すると残りの全てを返す。substr() は式の左辺にも使用できる。

symlink(oldfile, newfile)

oldfile を示すシンボリックファイル newfile を作成する。サポートされていないシステムでは致命的エラーとなるので eval を用いる。

◆ syscall(list)

sysread(FILEHANDLE, scalar, length, offset)
◆ sysread(FILEHANDLE, scalar, length)

ファイルから length バイト分を scalaroffset(省略時は 0)バイト目に読み込む。read() などと同時に用いるとバッファリングの関係で混乱が生じる。通常は実際に読み込んだバイト数を、失敗時は undef を返す。

system(list)

list で指定した外部コマンドを実行する。その実行コマンドの戻り値が system() の戻り値となる。

syswrite(FILEHANDLE, scalar, length, offset)
◆ syswrite(FILEHANDLE, scalar, length)

scalaroffset(省略時は 0)バイト目から length バイトをファイルに書き込む。print() などと同時に用いるとバッファリングの関係で混乱が生ずる。通常は書き込んだバイト数を、失敗時は undef を返す。

tell(FILEHANDLE)
◆ tell()

ファイルの現在の読み込み・書き込み位置を得る。

telldir(DIRHANDLE)

現在のディレクトリ位置を返す。この値は seekdir() で用いられる。

time()

現在の時刻を得る。グリニッジ標準時の1970年1月1日0時0分0秒からの秒数を返す。localtime() や gmtime() で変換する。

◆ tr/searchlist/replacement/cds

◆ y/searchlist/replacement/cds

truncate(FILEHANDLE, length)
◆ truncate(expr, length)

指定したファイルのサイズを変更する。サポートしていないシステムでは致命的エラーとなる。

◆ umask(expr)
◆ umask()

undef(expr)
◆ undef()

変数やサブルーチン名を指定して、これらを、定義されていない状態に戻す。

unless

if文と逆の意味で、「もし・・・でなければ」の処理を行う。

unless ($xx == 5) { print "5ではありません。\n"; }
unlink(list)

ファイルを削除する。削除に成功したファイルの個数を返す。

unpack(template, expr)

バイナリデータを解釈する。templatepack() のものと同様。

unpack("C", "A")  # AのASCIIコード0x41を返す
unshift(array, list)

配列の最初に要素(配列指定可能)を追加する。arraylist が追加される。

until (expr) { statements }

while の逆で、expr が真になるまで、statements を繰り返す。

utime(atime, mtime, filelist)

filelist で指定したファイルのアクセス時刻 atime と更新時刻 mtime を変更し、変更に成功したファイルの個数を返す。atimemtimetime() で得られるような値を用いる。

values(assoc_array)

指定された連想配列のすべての値の一覧を配列で返す。

foreach (values(%ENV)) {
    print;
}
◆ vec(expr, offset, bits)

◆ wait()

◆ waitpid(pid, flags)

wantarray()

サブルーチンの中で使用し、サブルーチンの戻り値が配列を期待しているかどうかを調べる。次の例は、@xx = &func() で呼び出すと (1, 2, 3) を返し、$xx = &func() で呼び出すと "A" を返す。

sub func { return wantarray() ? (1, 2, 3) : "A"; }
warn(list)

die と同様のメッセージを標準エラー出力 STDERR に出力する。ただしプロセスは終了しない。

while (expr) { statements }

expr が真の間、statements を繰り返す。

$xx = 1;
while ($xx < 10) {
    print "xx = $xx\n";
    $xx++;
}
write(FILEHANDLE)
◆ write(expr)
◆ write

format 文で指定したフォーマットに従って出力を行う。詳細説明省略。sysread() に対応するのは syswrite() だが、read() に対応するのは write() ではない。


Copyright (C) 1997-2003 杜甫々
初版:1997年9月28日、最終更新:2003年3月21日
http://www.tohoho-web.com/wwwperl2.htm