Perlの書き方


文法
トピックスモジュールデータベースTie(結合)
OOP(オブジェクト)ソケットHTTPD特殊文字
リファレンス正規表現変数変数呼び出し
特殊変数演算子ファイル演算子
サブルーチンシグナルハンドラ文字列(スカラー)配列(ハッシュ)
数学処理変数制御プログラム制御ファイル処理
システム関数関数一覧pod関数一覧Perlマニュアル
Perl日本語マニュアルpodマニュアルPerlTkマニュアルPerl Man
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";
   }


podマニュアル目次に戻る。
name.podはpod形式のマニュアルです。 読み方: pod2text <openssl.pod |less
特殊文字目次に戻る。
表記意味
\n改行文字(new line またはline feed)
\r復帰文字(carriage return)
\tタブ(tab)
\f改ページ(formfeed)
\bバックスペース(backspace)
\0338進表記文字
\x7f16進表記文字
\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";    <-- 等価
目次に戻る。

ファイル演算子目次に戻る。
例:
#!/usr/bin/perl
$file="/var/spool/mail/root";

if (-e $file){
   print "Yes.\n";
}
else {
   print "No.\n";
}

意味表記 意味表記
読みだし可能-r 書き込み可能-w
実行可能-x ユーサ所有-o
存在している-e サイズ0-z
サイズ0でない-s 普通のファイル-f
ディレクトリ-d シンボリックリンク-l
ソケット-S 名前付パイプ-P
ブロックデバイス-b キャラクタデバイス-c
テキストファイル-T バイナリファイル-B
内容更新後日数-M アクセス後日数-A
目次に戻る。

文:目次に戻る。
通常の実行文を単純文と呼び、;を末尾に付ける。
単純文を{}で囲むとブロック文(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

目次に戻る。

Perl Man目次に戻る。
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を既定値に変更する。

関数一覧目次に戻る。
目次に戻る。