- wantarrayのカテゴリ分けのミス修正と説明を追記。(2000.4.11)
- crypt()の使用例が誤っていたのを修正。(1999.7.18)
- 演算子で<==>と誤記していたのを<=>に修正。(1999.4.4)
- 未稿部分や、それぞれの関数の詳細な説明は下記のURLも参照してください。
http://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/index.html
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 - 値をフォーマッティングする
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 - 未稿
($package, $filename, $line) = caller;
# 暗号化したパスワード($epasswd)を得る srand(); $passwd = "himitsu"; $xx = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" . "abcdefghijklmnopqrstuvwxyz" . "0123456789./"; $salt = substr($xx, int(rand(64)), 1); $salt .= substr($xx, int(rand(64)), 1); $epasswd = crypt($passwd, $salt); # ファイルには $epasswd だけを保存する # 暗号化したパスワードでパスワードをチェックする # 同じ$saltで再度暗号化して同じ結果になればOK $salt = substr($epasswd, 0, 2); if ($epasswd eq crypt($passwd, $salt)) { print "Match!!\n"; }
defined($xx) # 偽を返す $xx = ""; defined($xx) # 真を返す $xx = 0; defined($xx) # 真を返す
open(IN, $file) || die "Can't open file.\n"; open(IN, $file) || die "Can't open file. Stopped";
$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);
while (($key, $value) = each(%xxx)) { print "$key = $value\n"; }
if ($xx == 5) { print "5です。\n"; } else { print "5ではありません。\n"; }
if ($xx == 5) { print "5です。\n"; } elsif ($xx == 6) { print "6です。\n"; } elsif ($xx == 7) { print "7です。\n"; } else { print "5でも6でも7でもありません。\n"; }
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"; }
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()を行った時やプログラムが終了する時には自動的にロックは解除される。
open(OUT, "+< outfile.txt"); flock(OUT, 2); truncate(OUT, 0); seek(OUT, 0, 0); print OUT "........"; close(OUT);
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"; }
@zz = (11, 22, 33, 44, 55); foreach $xx ( @zz ) { print "xx = $xx\n"; }
if ($pid = fork()) { print "これは親プロセスです。\n"; } else { print "これは子プロセスです。\n"; }
while ($c = getc(IN)) { print $c; }
$addr = (gethostbyname($host))[4]; $addr = sprintf("%u.%u.%u.%u", unpack("C*", $addr));
$addr = "127.0.0.1"; $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
@result = grep(/^#include/, @lines);
$ans = hex("FF");
if ($xx > 5) { print "5より大きい\n"; }
index("ABCDEFG", "DEF"); # 3を返す
$now = join(":", $hour, $min, $sec);
aaa: while (<IN>) { if (/^end/) last aaa; }
sub xxx { local($a); $a = 5 } $a = 3; &xxx; print $a;
($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以外の値)を表わす。
aaa: while (<IN>) { if (/^#/) { next aaa; } }
$ans = ($xx =~ /^0/) ? oct($xx) : $xx;
ファイルを読み込みモードでオープンする。
open(IN, "xxx.txt"); while (<IN>) { print; } close(IN);ファイルを書込みモードでオープンする。
open(OUT, "> xxx.txt"); print OUT "らくがき"; close(OUT);ファイルを読み書きモードでオープンする。
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(DIR, "tmp"); while ($file = readdir(DIR)) { print "$file\n"; } closedir(DIR);
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
print &calc'add(3, 5); package calc; sub add { return($_[0] + $_[1]); }
printf("Name=%s, Age=%d\n", $name, $age);
require "jcode.pl";
sub add { return($_[0] + $_[1]); }
@ans = reverse("abc", "def"); # ( "def", "abc" )が返される $ans = reverse("abc", "def"); # "cba"が返される。
$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);
sub sortfunc { $a <=> $b } @result = sort @list; @result = sort sortfunc @list; @result = sort { $a <=> $b } @list;この場合のsortfunc(名前は任意)などをソート関数とよぶ。 ソート関数には比較要素が $a, $b という名前で渡される。 結果として正、0、負のいずれかで返すようにする。
@hhmmss = split(/:/, "12:34:56");
$str = sprintf("%d", $number);
($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の結果をそのまま返す。 これは速度改善に役立つ。
sub add { return($_[0] + $_[1]); } print &add(5, 6);
unless ($xx == 5) { print "5ではありません。\n"; }
unpack("C", "A") # AのASCIIコード0x41を返す
sub func { return wantarray ? () : undef; }
$xx = 1; while ($xx < 10) { print "xx = $xx\n"; $xx++; }