Perlの書き方
Perl情報
Perlの小枝
モジュール資料
モジュール探索エンジン
別のモジュール探索エンジン
日本語Perl5.0マニアル
SteveC's Object-Oriented Perl Page
Perl-OOP
The OO Soapbox
Perl上級
Unix Review
元にもどる。
リファレンスはC言語におけるポインタと同様の機能をもつが、
対象は変数に留まらず、サブルーチン関数にまで及ぶ。また、
無名リファレンスもあり、OOPのための重要なテクニックになる。
1) スカラー変数の引用
変数の前に\をつけると、変数リファレンスが代入される。
変数の前に$をつけると、内容はリファレンスだと認識される。
$msg="日本麻酔学会";
$p=\$msg;
print $$p."\n";
2) 配列全体の引用
@msg=("日本","麻酔","学会");
$p=\@msg;
print join(".",@$p)."\n";
日本.麻酔.学会と出力される。
print @$p."\n";
配列の個数3が出力される。
3) 配列個々の引用
@msg=("日本","麻酔","学会");
$p=\@msg;
print $p->[0]."\n";
日本と出力される。
配列個々の引用は$p->[$i]以外に$$p[$i]、${$p}[$i]とも
記述できる。
4) 無名配列全体の引用
配列全体を[...]でくくると無名配列を定義する。
$p=["日本","麻酔","学会"];
print join(".",@$p)."\n";
日本.麻酔.学会と出力される。
5) 無名配列個々の引用
$p->[0]="日本";
$p->[1]="麻酔";
$p->[2]="学会";
print join(".",@$p)."\n";
日本.麻酔.学会と出力される。$$p[0]="日本";と書いてもよい。
6) ハッシュの引用
%msg=('J'=>"日本",'S'=>"麻酔",'A'=>"学会");
$p=\%msg;
foreach $key (sort keys %msg) {
print $key.":".$msg{$key}."\n";
}
foreach $key (sort keys %$p) {
print $key.":".$p->{$key}."\n";
}
7) 無名ハッシュの引用
ハッシュ全体を{...}でくくると無名ハッシュを定義する。
$p={'J'=>"日本",'S'=>"麻酔",'A'=>"学会"};
foreach $key (sort keys %$p) {
print $key.":".$p->{$key}."\n";
}
8) 無名ハッシュ個々の引用
$p->{J}="日本";
$p->{S}="麻酔";
$p->{A}="学会";
foreach $key (sort keys %$p) {
print $key.":".$p->{$key}."\n";
}
name.podはpod形式のマニュアルです。
読み方:
pod2text <openssl.pod |less
| 表記 | 意味 |
| \n | 改行文字(new line またはline feed) |
| \r | 復帰文字(carriage return) |
| \t | タブ(tab) |
| \f | 改ページ(formfeed) |
| \b | バックスペース(backspace) |
| \033 | 8進表記文字 |
| \x7f | 16進表記文字 |
| \cC | コントロール文字C |
| \u | 次の一字を大文字に変換 |
| \l | 次の一字を小文字に変換 |
| \U | これ以降に続く文字を大文字に変換 |
| \L | これ以降に続く文字を小文字に変換 |
| \E | \Uと\Lの機能を停止する |
目次に戻る。
| 表記 | 意味 |
| \a | ベル |
| \n | 改行文字(new line またはline feed) |
| \r | 復帰文字(carriage return) |
| \t | タブ(tab) |
| \f | 改ページ(formfeed) |
| \e | エスケープ文字 |
| \d | 数字 |
| \D | 数字以外 |
| \w | 英数字 |
| \W | 英数字以外 |
| \s | 空白文字 |
| \S | 空白文字以外 |
目次に戻る。
NAME ファイルハンドル、ディレクトリハンドル(通常大文字)
$name スカラー変数(数値、文字)
$n=30; $a="\"";
@name 配列(数値をインデックスとする)
@name=("one","two","three");
print $name[0],"\n";
配列をスカラー変数に代入すると配列の要素数がわかる。
@adata = split(' ',$data);
$n=@adata;
print $n,"\n";
%name ハッシュ(文字列をインデックスとする配列)
%name=("one","two","three","four");
"one","three"がインデックスとなり、"two",,"four"が要素(中身)になる。
要素を呼び出す時は変数名に$をつける。
print $name{"one"},"\n";
別法
%name=(
"one"=>"two",
"three"=>"four"
);
print $name{one},"\n"; # {"one"}でもよい。
例:スペースで区分された2列のファイルから連想配列を作成する。
$fin="$pwd/hcmm.data.c2";
$data=`cat $fin`;
$data=~tr/ \n/,/;
%shcmm=split(",",$data);
print $shcmm{"01"},"\n";
&name サブルーチン
Localを指定しないかぎりグローバル変数になる。
#!/usr/bin/perl
$a=1;
&mv($a);
print $j,"\n";
sub mv{
local($i)=@_;
$j=$i+1;
}
[] 無名の配列
$ra=[1, 2, 3]; # $raはリファレンス
print $$ra[0],"\n";
print ${$ra}[0],"\n";
print $ra->[0],"\n";
マトリックス 無名の配列の応用
@matrix = (
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
);
print $matrix[1][2],"\n"; # 6を出力する。
{} 無名のハッシュ
$rh={"k1", "v1", "k2", "v2"}; # $rhはリファレンス
print $$rh{k1},"\n";
print ${$rh}{k1},"\n";
print $rh->{k1},"\n";
マトリックス(2) ハッシュの応用
要素0が多い場合はハッシュを用いる。
$matrix{0}{2}=100;
$matrix{1}{0}=200;
$matrix{3}{1}=300;
print $matrix{0}{2},"\n";
$rmatrix=\%matrix;
print $rmatrix->{0}{2},"\n";
演算の前に要素の存在をexistsで調べる。
(行だけを調べることもできる)
if(exists $matrix{0}){
print "Yes\n";
}
else {
print "no\n";
}
*name nameという名前を持つもの全て
""で囲まれた変数は変数展開する。
$a=123; $b=456; c="$a$b"なら
$c=123456と同じ。
``で囲まれた中身はコマンドと解釈され結果を返す。
$d=`ls -l`; print $d,"\n";
目次に戻る。
直接呼び出し:
$a="JSA";
$b=$a;
print $b,"\n";
間接呼び出し:
$a="JSA";
$b=\$a; # $bは$aのリファレンス
print $$b,"\n"; # $$bはディリファレンス
配列(ハッシュ)の場合
@a=(1, 2, 3);
$b=\@a;
print $$b[0],"\n"; # これでもよい。
print $b->[0],"\n"; # この表示の方が分かりやすい。
$n=@$b;
print $n,"\n"; # 配列の要素数を表示する。
print @$b,"\n"; # 配列の要素を全て表示する。
| 比較 | 数値 | 文字列 |
比較 | 数値 | 文字列 |
|---|
| 等しい | == | eq |
等しくない | != | ne |
| 小さい | < | lt |
大きい | > | gt |
| 小さいか等しい | <= | le |
大きいか等しい | >= | ge |
| マッチする | =~ |
マッチしない | !~ |
| 論理(OR) | || | or |
論理(AND) | && | and |
| 論理(NOT) | ! | not |
論理(XOR) |
| xor |
| 文字列結合 | $str1.$str2 |
文字列をt回繰り返す | $str x t |
| 文字列の結合代入 | $str1.=$str2 |
|
|
| 積 | * |
商 | / |
| 和 | + |
差 | - |
| $varをvalue増やす | $var+=value |
$varをvalue減らす | $var-=value |
| 評価後に$varを1増やす | $var++ |
評価前に$varを1増やす | ++$var |
| 評価後に$varを1減らす | $var-- |
評価前に$varを1減らす | --$var |
| 左ビットシフト | << |
右ビットシフト | >> |
| 剰余 | % |
リファレンス | \ |
| 配列リファレンス | [ ] |
要素 | $ |
| サブルーチン呼び出し | & |
デリファレンス | ->[] |
| ハッシュへの代入 | => |
|
|
例:コマンドラインに数値が指定されなければ9999を設定する。
$port=shift || 9999;
例:リファレンスと要素
#!/usr/bin/perl
$a="JSA";
$b=\$a;
print $$b,"\n";
例:配列リファレンスと要素
#!/usr/bin/perl
$a="JSA";
$b=[$a, 1];
print $$b[0],"\n"; <-- 等価
print ${$b}[0],"\n"; <-- 等価
print $b->[0],"\n"; <-- 等価
目次に戻る。
| 意味 | 表記 |
意味 | 表記 |
|---|
| 読みだし可能 | -r |
書き込み可能 | -w |
| 実行可能 | -x |
ユーサ所有 | -o |
| 存在している | -e |
サイズ0 | -z |
| サイズ0でない | -s |
普通のファイル | -f |
| ディレクトリ | -d |
シンボリックリンク | -l |
| ソケット | -S |
名前付パイプ | -P |
| ブロックデバイス | -b |
キャラクタデバイス | -c |
| テキストファイル | -T |
バイナリファイル | -B |
| 内容更新後日数 | -M |
アクセス後日数 | -A |
| |
| |
例:
#!/usr/bin/perl
$file="/var/spool/mail/root";
if (-e $file){
print "Yes.\n";
}
else {
print "No.\n";
}
目次に戻る。
通常の実行文を単純文と呼び、;を末尾に付ける。
単純文を{}で囲むとブロック文(BLOCK)と呼び、一連の単純文が実行される。
単純文 if 判定文;
$a=3;
print $a,"\n" if $a>2;
if (EXPR) BLOCK
if($a>3){
print $a,"\n";
}
判定文 ? 真単純文 : 偽単純文;
$a>2 ? print $a,"\n": print "No\n";
if (EXPR) BLOCK else BLOCK
if (EXPR) BLOCK elseif (EXPR) BLOCK ... else BLOCK
LABEL: while (EXPR) BLOCK
LABEL: while (EXPR) BLOCK continue BLOCK
LABEL: for (EXPR; EXPR; EXPR) BLOCK
for ($i=0;$i<$n;$i++) {
print $i,"\n";
}
LABEL: foreach $scalar (LIST) BLOCK
$f="0,1,2";
@list=split(",",$f);
foreach $fi (@list){
print $fdata[$fi],$d;
}
引数<ARGV>の配列がある間繰り返す。
while (<ARGV>) {
... ;
}
目次に戻る。
例:CTRL+Cでプログラムをストップする。
#!/usr/bin/perl
#サブルーチン:
sub ctrl_c_handler{
print "CTRL+C pressed \n";
exit;
}
#メインプログラム:
$SIG {"INT"}=\&ctrl_c_handler; <-- %SIGハッシュにアドレスを書く
for($i=0;$i<10000;$i++){
print "$i abcdefghijklmnpqrstuvwxyz\n";
}
例:10秒たてばプロセスは終了する。
#!/usr/bin/perl
sub timed_out {
exit;
}
$SIG{ALRM}=\&timed_out;
alarm(10);
$buf=<>;
例:キー入力に10秒の余裕を与える。
#!/usr/bin/perl
sub timed_out {
die "GOT TIRED OF WAITING";
}
$SIG{ALRM}=\&timed_out;
eval {
alarm(10);
$buf=<>;
alarm(0);
};
if ($@ =~ /GOT TIRED OF WAITING/){
print "Timed out. Proceeding with default\n";
$buf="no";
}
print "$buf\n";
例:ファイルを2秒毎に表示する。
#!/usr/bin/perl
open(TMP,"../d980317");
sub loop {
alarm(2);
if ($data= <TMP>){
chop($data);
print $data,"\n";
}
else {
close(TMP);
}
}
$SIG{ALRM}=\&loop;
loop;
while(1) {
pause;
}
シグナルハンドラを表示する。
#!/usr/bin/perl
use Config;
print $Config{sig_name};
結果:
ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL
USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD
CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM
PROF WINCH IO PWR UNUSED IOT CLD POLL
目次に戻る。
perldocはUNIXのmanと同じ動作をする。
perldoc マニュアル|モジュール|スクリプト
perldoc -f 関数名
perldoc -q キーワード(FAQ)
例:
perldoc sigtrap
perldoc -f sort
モジュールマニュアルは
.cshrcのMANPATHに/usr/lib/perl5/5.00502/manを追加し、
manで呼び出す。
例:
man HTTP::Response
モジュールの確認
例えば
perldoc DBI
perldoc XML::Parser
で既にインストールしているか調べる。
インストール状況表示
perldoc perllocal
INCパスの表示:
perl -le 'print join $/, @INC'
INCパスの設定:
MakefileのPREFIXを既定値に変更する。
- スカラー処理
chomp,
chop,
chr,
crypt,
hex,
index,
lc,
lcfirst,
length,
oct,
ord,
pack,
q//,
qq//,
reverse,
rindex,
sprintf,
substr,
tr///,
uc,
ucfirst,
y///
- 正規表現とパターンマッチ
m//,
pos,
quotemeta,
s///,
split,
study
- 数学関数
abs,
atan2,
cos,
exp,
hex,
int,
log,
rand,
sin,
sqrt,
srand
- 配列処理
pop,
push,
shift,
splice,
unshift
- リスト処理
grep,
join,
map,
qw//,
reverse,
sort,
unpack
- ハッシュ処理
delete,
each,
exists,
keys,
values,
- 入出力
binmode,
close,
closedir,
dbmclose,
dbmopen,
die,
eof,
fileno,
flock,
format,
getc,
print,
printf,
read,
readdir,
rewinddir,
seek,
seekdir,
select,
syscall,
sysread,
syswrite,
tell,
telldir,
truncate,
warn,
write,
- 固定長データとレコード
pack,
read,
sycal,
sredswrite,
upc,
vec
- ファイルハンドル、ファイル、ディレクトリ
chdir,
chmod,
chown,
chroot,
fcntl,
glob,
ioctl,
link,
lstat,
mkdir,
open,
opendir,
readlinkm,
rename,
rmdir,
select,
stat,
symlink,
sysopen,
umask,
unlink,
utime
- プログラムの流れの制御
caller,
continue,
die,
do,
dump,
eval,
exit,
goto,
last,
next,
redo,
return,
sub,
wantarray
- スコープ
caller,
import,
local,
my,
package,
use
- その他
defined,
dump,
eval,
formline,
local,
my,
reset,
scalar,
undef,
wantarray
- プロセスとプロセスグループ
alarm,
exec,
fork,
getpgrp,
getppid,
getpriority,
kill,
pipe,
qx//,
setpgrp,
setpriority,
sleep,
system,
times,
wait,
waitpid
- ライブラリモジュール
do,
import,
no,
package,
require,
use
- クラスとオブジェクト
bless,
dbmclose,
dbmopen,
package,
ref,
tie,
tied,
untie,
use
- 低レベルソケットアクセス
accept,
bind,
connect,
getpeername,
getsockname,
getsockopt,
listen,
recv,
send,
setockopt,
shutdown,
socket,
socketpair
- システムVのプロセス間通信
msgctl,
msgget,
msgrcv,
msgsnd,
semctl,
semget,
semop,
shmetl,
shmget,
shmread,
shmwrite
- ユーザ情報とグループ情報の取得
endgrent,
endhostent,
endnetent,
endpwent,
getgrent,
getgrgid,
getgrnam,
getlogin,
getpwent,
getpwnam,
getpwuid,
setgrent,
setpwent
- 時間
gmtime, localtime,
time, times
目次に戻る。