Software_Perl

☆Perl

TMTOWTDI
There’s More Than One Way To Do It

┌──┐
│目次│
├──┘
│◎文法
│ ◆文、ブロック、コメント stat
│ ◆変数 var
│ ◆定数 const
│ ◆プラグマ pragma
│ ◆制御構造 cont
│ ◆関数 func
│ ◆演算子 opr
│ ◆文字列 str
│ ◆組み込み関数 emb
│ ◆入出力 io
│ ◆ファイル操作 file
│ ◆コマンドライン引数 cmdlinarg
│ ◆シグナルの受信の宣言 signal
│ ◆パッケージ package
│ ◆モジュール module
│ ◆文字コード charcode
◎ライブラリ lib
◎サンプル sample
◎インタプリタ interpreter
◎Tips tips
◎perlの実行方法 exec

◎文法


◆文、ブロック、コメント
①文
式の後ろにセミコロンをおいたもの
②ブロック
文のならびを{}で囲んだもの
③式の後ろには修飾子をつけることができる
│ 式1 if 式2
│ (式2が真なら式1評価)
│ 式1 unless 式2
│ (式2が偽なら式1評価)
│ 式1 while 式2
│ (式2が真の間、式1評価)
│ 式1 until 式2
│ (式2が偽の間、式1評価)
④ブロックにはラベルをつけられる
│ ラベル: ブロック
⑤コメント
│ #から行末まで


◆変数

※変数名には’_’を含む半角英数字、ただし先頭は数字でないものを使える。

※ $var
│ スカラー変数

※ @array
│ 配列
│ 要素)
│  $array[数値]
│ スライス)
│  @array[数値,数値…]
│ 最後の要素のインデックス)
│  $#array

※ %assoc
│ 連想配列
│ 要素)
│  $assoc{文字列}
│ 連想配列のスライス
│  @assoc{文字列,文字列…}

_◇特殊変数

※$_
│ デフォルト操作対象

※$PROGRAM_NAME
│ プログラムの名前

※@ARGV
│ perl実行時引数
│ ⇒スクリプト名の次にかかれたものが$ARGV[0]

※%ENV
│ 環境変数、連想配列
│ 例)
│ $path=$ENV{“PATH”};
│ @path=split(/:/,$path);

※%SIG
│ シグナルハンドラ表。他のプロセスからシグナルを受け取ったときに実行される関数を設定する。
│ 例)

sub handler {
    my($sig)=@_;
    print "catch $sig\n";
    exit(0);
}
$SIG{"INT"}=\&handler;

※$!

_◇ローカル変数宣言

①my

my ($var1, … , $varn) [ = 初期値];

myで宣言した変数は、宣言したルーチンでのみ参照できる

※レキシカルスコープ(静的スコープ)

②local

local ($var1, … , $varn) [ = 初期値];

localで宣言した変数は、local宣言したルーチンが呼び出したルーチンからのアクセスを許す。

※ダイナミックスコープ(動的スコープ)
⇒グローバル変数を上書きして局所化する。
⇒グローバル変数を書き換える意図が無い場合には、安全にグローバル変数が使える

③state
use feature ‘state’; 宣言必要

state ($var1, … , $varn) [ = 初期値];

ローカルだが、スタティクな変数

※ローカル変数の指定は、サブルーチンもしくはブロック

_◇配列

※ @a
│ 配列全体
│ (リストコンテキスト)

※ $len = @a
│ 配列の長さ
│ (スカラーコンテキスト)

※ $a[i]
│ i番目の要素

※ $#a
│ 最後の要素のインデックス

※ @a = (“a”,”b”,”c”)
│ 値の設定

※配列は左辺値にもできる
│ 例)
│ ($a, $b, @rest)=(1,2,3,4)

※配列をなめる
│ 例)
│ foreach $x (@a) {
│  $xについての処理
│ }
│ 例)
│ for ($i=0; $i<@a; $i++){
│  $a[$i]についての処理
│ }

※配列変数をダブルクオート文字列の中に書くと、全部の要素の値をスペースで区切って並べた文字列に展開される。
⇒$” 英名$LIST_SEPARATORに文字列を設定するとスペースでなく設定した文字列が使われる。

_◇連想配列

※ %h
│ 連想配列全体

※ %h = (“key1″=>”value1”,..)
⇒ %h=(“key1″,”value1″,..)
│ =>と,は同じ
│ 例)
│ %h = (
│ ”key1″=>”value1″,
│ ”key2″=>”value2”,
│ );
│ リストの最後の,はつけてもつけなくても良い。

※存在しないキーで読み出すとundefがかえる(undefは偽と判断される。)

※要素の追加
│ $h{“key3″}=”value3″;

※ $h{$key}
│ $keyに対する要素

※ delete($h{$key})
│ 要素を削除

※ exists($h{$key})
│ 要素が存在するか

※ keys(%h)
│ 連想配列の全キーの配列を返す。

※ values(%)
│ 連想配列の全ての値の配列を返す。

※配列と異なりダブルクオート文字列の中でも展開されない。

※連想配列をなめる
│ 例)
│ foreach $key (keys(%h)) {
│  $v = $h{$key};
│  $key,$vについての処理
│ }
│ 例)
│ while (($key, $v)=each(%h)){
│  $key,$vについての処理
│ }

※ファイル読み出し
例)
use Fcntl;
use SDBM_File;
tie(%h,SDBM_File,”File名”,O_RDONLY,0);
│ %hについての操作
untie(%h);

※ファイル書き込み
例)
use Fcntl;
use SDBM_File;
tie(%h,SDBM_File,”File名”,O_RDWR|O_CREAT,0644);
│ %hについての操作
untie(%h);
⇒File名.dirおよびFile名.pagが作成される。

※ファイルモード
│ O_RDWR 読み書きモード
│ O_CREAT ファイル作成

_◇DBM
連想配列をデータベースにマッピングして使用できる

※use GDBM_File;
│ GNU DBM、キーと値の長さに制限無し

※use SDBM_File;
│ Perl同梱のDBM。キーと値の長さに制限あり(1Kもしくは4Kなど)

※use ODBM_File;
│ キーと値の長さ1K。

※use NDBM_File;
│ キーと値の長さ4K。

※use DB_File;
│ Berkeley DB。強力。

_◇リファレンス

※ \
│ リファレンス演算子。変数などのアドレスを取り出す。
│ 例)
│ $ref_word = \$word;
│ $ref_array = \@list;
│ $ref_sub = \⊂

※リファレンスから変数の値を参照するには、参照先の変数の識別子を先頭に付け足す。
│ 例)
│ $$ref_word;
│ @$ref_array;
│ &$ref_sub;

※矢印演算子( -> )
│ $$ref_hash{‘element1’};
│ $ref_hash->{‘element1’};
⇒矢印演算子は、カッコつきの添え字の間にあるときは省略することができる。
│ $ref_data[0][0] = 3.14

※無名配列へのリファレンス
$ref_array = [1, 2, 3, 4, 5];
print $ref_array->[0], “\n”;

※多重配列
│ 例)
│ @array = (
│  [1, 2],
│  [3, 4],
│ );
│ print $array[0][0];
│ > 1

_◇型グロブ
同名の
│ $ スカラー
│ @ 配列
│ % ハッシュ
│ & サブルーチン
参照している実体が型グロブ

※型グロブを介した参照
*var{SCALAR}
*var{ARRAY}
*var{CODE}
あるいは
\${*var}
\@{*var}
\&{*var}

※型グロブを別の識別子に型グロブ代入することで、全ての型の変数を別名で参照できる

*a = *b;

で$b, @bなどの参照は全て$a, @aでも参照できるようになる。


◆定数
※数値
│ 123
│ 1.234
│ 5E-10
│ 0xff
│ 0377
※文字列
│ ”abc”
│  変数展開あり
│  エスケープシーケンスあり
│ qq{abc}
│  変数展開あり
│  エスケープシーケンスあり
│  “を{}にそのまま書ける
│  {}以外に(),[],<>可能
│ <<“終端文字列”
│  次の行から終端文字列まで
│  例)
│  print <<“END”;
│  abc
│  END
│  <<“END”の部分=文字列
│ ’abc’
│  変数展開なし
│  エスケープシーケンスなし
│  \’と\\だけは処理
│ q{abc}
│  変数展開なし
│  エスケープシーケンスなし
│  ‘を{}にそのまま書ける
│  {}以外に(),[],<>可能
│ <<‘終端文字列’
│  次の行から終端文字列まで
│  例)
│  print <<‘END’;
│  abc
│  END
│  <<‘END’の部分=文字列
※配列定数
│ (1,2,3)
│ (1..4)=(1,2,3,4)


◆プラグマ

_◇English
※use English;
│ 英語の特殊変数名使用宣言

_◇utf8
※use utf8;
│ Scriptが UTF-8で書かれていることを宣言
⇒ソースの中の文字列がUTF-8となる
⇒マルチバイトの変数名が使える

_◇openプラグマ
入出力のデフォルトのエンコーディングを指定する
use open IN => “:utf8”;
use open OUT => “:utf8”;
use open IO => “:utf8”;
use open IN => “:encoding(CHAR_SET)”;
use open OUT => “:encoding(CHAR_SET)”;
use open IO => “:encoding(CHAR_SET)”;

※標準入出力、エラーについては下記を宣言しないと
上記の設定は影響しない

use open “:std”;


◆制御構造

※真と偽
0および、0をあらわす文字列、空文字列””が偽となり、それ以外が真となる。

※if (cond) { }

※if (cond) { } else { }

※if (cond) { }
│ elsif (cond) { }

※unless
│ ifの反対。~でなければ

※while (cond) { }

※while (cond) { } continue { }
│ continueブロックは繰り返しブロックが終わった後に毎回実行される。
⇒繰り返しブロック中
│ next [label]
実行すると繰り返し本体を抜け、continueブロックを実行して繰り返し条件の判定から実行する。labelをつけるとそのラベルのついた制御文を実行する。
│ redo [label]
実行すると条件判定をせず、繰り返し本体を繰り返す。
│ last [label]
実行すると繰り返し本体より脱出する。continueブロックは実行されない。
※for (初期化,条件,繰り返し時){}

※foreach 変数 (配列) {}

※do ブロック while 条件

※do ブロック until 条件

※foreach 変数 (配列) {}

※式1 or 式2
│ 式1がだめなら式2

※式1 ? 式2 : 式3

※exit (式) プログラム終了

※die(文字列)プログラムを終了


◆関数

_◇関数呼び出し

関数名(引数,..);
&関数名(引数,..);

⇒関数呼び出しが関数定義の前にある場合には()を省略することができる。

_◇関数定義

sub 関数名 {
│ my ($arg1,..) = @_;
│ …
}
@_ 引数が渡される配列
⇒$_[0], $_[1],$_[2]…
⇒名前呼びなので、関数の中で書き換えるともとの変数が書き換わる。
⇒最後に計算した値が戻り値となる

※ my
ローカル変数定義

※ local
グローバル変数の値を一時的に別の値にする。localで作った変数はその関数とその関数が呼び出した関数で使える。

※ return(式)
式の値でリターン

※ wantarray
リストコンテキストテスト
例)
│ wantarray? @a:$a[0];

※引数の参照渡し
⇒もともとperlの引数は参照渡しなので操作すれば外でも反映する
※引数の型グロブ渡し
型グロブを渡せば、同名の全ての型の変数を別名で操作できる
⇒複数の配列を渡したり、配列要素を操作するときに便利

関数呼出時
&関数名(*配列名1, *配列名2);

関数内でローカル配列に設定
local(*ローカル名1,*ローカル名2) = @_;

_◇プロトタイプ付きの関数定義

sub 関数名(引数プロトタイプ) {
│ …
}

引数プロトタイプ用のシンボルを記述することで引数をチェックできる

$ スカラ
@ リスト
% ハッシュ
& 無名サブルーチン
* 型グロブ

スカラ引数2個なら $$ とかく
しかし、リストやハッシュは、残りの引数をまとめて飲み込んでしまう。
⇒リストやハッシュを1個だけ引数にとりたいときは
\@
などと頭にバックスラッシュをつける

※必須引数の後に ; をつけると、以下はオプショナルな引数となり、あっても無くても良くなる。


◆演算子

_◇算術論理演算子

※ ++
│ インクリメント

※ —
│ デクリメント

※ !
│ 単項演算:論理否定

※ ~
│ 単項演算:ビット毎の論理否定

※ **
│ べき乗

※ *
│ 乗算

※ /
│ 除算
⇒整数計算を指定するためには、該当部分を
│ use integer;
│ no integer;
で囲む。

※ %
│ 剰余

※ <<
│ ビット左シフト

※ >>
│ ビット右シフト

※ &
│ ビット論理積

※ |
│ ビット論理和

※ ^
│ ビット排他的論理和

※ &&
│ 論理積

※ ||
│ 論理和

_◇範囲演算子
│ ..
│ リストコンテキストでは、左の値から右の値まで数えあげた値からなる配列を返す。
│ 例)
│ @alphabet = (‘A’ .. ‘Z’);
│ @z2 = (’01’ .. ’31’);

_◇比較演算子

※ ==
│ 数が等しいか
※ !=
│ 数が等しくないか
※ <=>
│ 数の比較。左が右より大きければ1、等しければ0、右が大きければ-1
※ <,<=,>,>=
│ 数の大小比較
※ eq
│ 文字列が等しいか
※ ne
│ 文字列が等しくないか
※ lt,le,gt,ge
│ 文字列の大小比較
※ cmp
│ 文字列の比較、-1,0,1を返す。


◆文字列

※ダブルクオーテション
“”の中では、変数やエスケープシーケンスが評価される。
※シングルクオーテーション
”の中では、変数やエスケープシーケンスが評価されない。

_◇文字列操作
※.
│ ピリオド演算子、文字列を結合する。変数展開で代用できることが多い。
│ 例)
│ $str = $a.$b;
│ ($str = “$a.$b”;と同じ
│ 例)文字列の追加
│ $a .= $b;

※”文字列” x 数字
│ 文字列を数字回だけ繰り返した文字列。

※tr/文字リスト/文字リスト/
│ 文字の置き換え。置き換えた文字数を返す。置き換え先を空にすると同じ文字に置き換えるので文字の出現回数を調べられる。
│ 例)
│ $str =~ tr/a-z/A-Z/
│ (小文字を大文字にする)
│ $count = ($str =~ tr/0-9//);
│ (数字の個数を数える)
trをyと書いても良い。

_◇エスケープシーケンス
│ \t 水平タブ
│ \n 改行
│ \r リターン
│ \f FF
│ \b バックスペース
│ \a アラーム(ベル)
│ \e エスケープ
│ \033 8進表記
│ \x1b 16進表記
│ \c[ コントロール文字
│ \l 次を小文字に
│ \u 次を大文字に
│ \L \Eまでを小文字に
│ \U \Eまでを大文字に

_◇正規表現

※ \
エスケープシーケンス
│ ①\d 数字
│ ②\D 数字以外
│ ③\w 英数字
│ ④\W 英数字以外
│ ⑤\s 空白文字
│ ⑥\S 空白文字以外
│ ⑦\b 単語境界
│ ⑧\B 単語境界以外

※ ^
行(文字列)の先頭

※ $
行(文字列)の最後

※ .
任意の1文字(通常改行を除く)

※ []
文字クラス
│ 例) [abc]
│ aかbかc
│ 例) [a-c]
│ aからcのどれか一文字
│ 例) [^a-c]
│ aからc以外のどれか1文字
│ ⇒]は文字クラス開始の[の直後に書くと]という文字として認識。
│ ⇒[は文字クラスの中では通常文字として認識。
│ ⇒^は先頭以外に書けば普通の文字となる。
│ ⇒-は範囲を表す形式にならないようにすれば通常文字となる。
│ ⇒文字クラスの中では*や+などのメタ文字も通常の文字となる。
│ ⇒文字クラスの中でもエスケープシーケンスは有効。

※ *
0回以上の繰り返し
│ 例)a*

※ +
1回以上の繰り返し
│ 例)a+

※ ?
0回か1回
│ 例)a?
⇒?をつけることで最短マッチとなる。
│ 例)a*?
│ 例)a+?
│ 例)a??
│ 例)a{n}?

※ {n}
n回繰り返し
│ 例) a{3}

※ {n,}
n回以上繰り返し
│ 例) a{3,}

※ {n,m}
n回以上m回以下繰り返し
│ 例) a{3,7}

※ |
または
│ 例)(a | b)

※ ()
グループを作る。変数$1..に入る。

※ \1..
正規表現内でのグループ参照。

※ ¥Q
\Eまでメタ文字の意味をなくす。

_◇パターンマッチ

※変数 =~ /正規表現/
変数 =~ m{正規表現}

※変数 !~ /正規表現/
│ =~の否定。

※/正規表現/
│ $_とのパターンマッチ

※/正規表現/option
│ オプション(複数指定可)
│ ①i 大文字小文字無視
│ ②g 繰り返しマッチ
│ ⇒pos関数
│ ③m ^と$が途中でもマッチ
│ ④s .が改行とマッチ

※マッチするとセットされる変数
⇒英語の特殊変数名を使うためには
│ use English;
宣言が必要。

①$`, $PREMATCH
│ マッチより前
②$&, $MATCH
│ マッチした部分
③$’, $POSTMATCH
│ マッチより後
④$1…
│ 正規表現中()されたグループ

※ pos
次回gオプションでパターンマッチする場合の開始位置(バイト単位)
│ 例)pos($str)
│ $strはパターンマッチ対象

_◇置換

※変数 =~ s/正規表現/置換文字列/
│ オプション(複数指定可)
│ ①i 大文字小文字無視
│ ②g 全部置き換える
│ ③m ^と$が途中でもマッチ
│ ④s .が改行とマッチ
│ ⑤e 置換文字列を実行


◆組み込み関数

_◇算術関数

※ abs(式)
│ 式の絶対値を返す。

※ atan2(式1, 式2)
│ 式1/式2のアークタンジェント
│ 値域は、-π~π

※ cos(式)
│ コサイン

※ exp(式)
│ eの[式]乗

※ int(式)
│ 小数部切捨て
│ ⇒切り上げ
│ $ceil = ( $a == int($a) ? $a : int($a + 1) );
│ ⇒浮動小数点切捨て
│ 例)小数第1位まで
│ $x = int($a * 10) / 10;
│ ⇒4捨5入(小数点以下)
│ $x = int( $a + 0.5 );

※ log(式)
│ 自然対数

※ rand(式)
│ 0から式までの乱数

※ sin(式)
│ サイン

※ sqrt(式)
│ 平方根

※ srand(式)
│ 乱数種セット、式を省略するとtimeが使われる

_◇変換関数

※ hex(文字列)
│ 16進文字列を10進数に

※ oct(文字列)
│ 8進もしくは16進文字列を10進数に
│ 8進… 0NN
│ 16進… 0xNN

※ chr(数値)
│ 数値で表される値を文字コードに変換

※ ord($str)
│ 文字列の先頭の文字のアスキーコードを返す。

※ vec(ベクトル文字列)

_◇時間関数

※gmtime(time)
│ timeをGMTに変換する。結果はリスト。
($s,$m,$h,$d,$mo,$y,$dofw,$ny,$sum) = localtime(time);

※localtime
│ timeをローカル時間に変換する。結果はリスト。
($s,$m,$h,$d,$mo,$y,$dofw,$ny,$sum) = localtime(time);

※time
│ 1970/1/1 00:00:00からの秒数を返す。

_◇配列操作関数

※ shift(@a)
│ 配列要素から1要素取り出す

※ unshift(@a,要素,要素,..)
│ 配列先頭に要素追加

※ pop(@a)
│ 配列末尾から1要素取り出す

※ push(@a,要素,要素,…)
│ 配列末尾に要素追加

※ splice(@a,位置,長さ,要素..)
│ 指定した位置、長さの部分を要素に置き換える。

※ @a = split(/区切/,$str)
│ $strを区切で分けた配列。

※ $str = join(“区切”,@a)
│ @aの要素を区切で結合。

※ sort(@a)
│ @aをソートした配列を返す
│ @sorted = sort(@a);
│ @sorted = {$a cmp $b} @a;
│ 上の2つは同じ。
│ @sorted = {$b cmp $a} @a;
│ 逆順でソート
│ ⇒sort{ $a <=> $b } @a
│  数でソート
│ ⇒入力をソートして印刷
│  print sort(<>);

※ reverse(@a)
│ 配列の要素を逆順にする。
│ 例)
│ @sorted = reverse(sort(@a));
│ @aを逆順ソートした配列を返す

※ grep(/検索対象文字列/,@a)
│ スカラーコンテキストでは、マッチした数
│ 配列コンテキストではマッチした要素の配列

※ scalar(式)
│ スカラーコンテキストの戻り値を与える

_◇文字列操作関数

※chomp (Perl v5以降)
│ 末尾の改行文字を切り落とす。
│ 例)
│ chomp $_に対して
│ chomp($a) $aに対して
│ chomp(@a) 配列の全変数

※chop
│ 無条件で最後の1バイトを切り落とす。

※substr($str, 位置, 長さ)
│ 部分文字列

※length($str)
│ 文字列の長さ

※crypt(暗号化文字列,キー)
│ キーの先頭2文字で暗号化した文字列を返す

※index(検索対象文字列,検索文字列,検索位置)
│ 検索文字列の見つかった位置を返す

※rindex(検索対象文字列,検索文字列,検索位置)
│ 末尾から検索し見つかった位置を返す

※lc(変換文字列)
│ 大文字を小文字に変換

※lcfirst(変換文字列)
│ 文字列先頭文字を小文字に変換

※uc(変換文字列)
│ 小文字を大文字に変換

※ucfirst(変換文字列)
│ 文字列先頭文字を大文字に変換

※quotemeta(変換対象文字列)
│ 英数字以外の文字の前に\を挿入

_◇システム

※eval
eval EXPR
eval BLOCK
引数の値をPerlのスクリプトとして実行する。設定された変数、サブルーチンはその後も有効となる。返される値は、最後に評価した式の値か、return文の値となる。

例)
$expr1 = ‘$answer = ‘;
$expr2 = ‘$a / $b’;
eval “$expr1$expr2”;

構文エラーや実行エラーが発生するか、die文が実行されると、evalの値として未定義値が返され、$@にエラーメッセージが設定さる。エラーがなければ、$@は空文字列となる。evalは、致命的エラーをトラップすることができるので、dbmopenやsymlinkといった特定の機能が実装されているかを調べるのに効果的である。

例)
# 0 除算を致命的でなくす
eval { $answer = $a / $b; };
warn $@ if $@;

※tie
tie VARIABLE, PACKAGENAME, LIST
tieは、変数とクラスを関連付ける。VARIABLEには、関連付けをする変数、PACKAGENAMEには、オブジェクトを実装するクラス名を指定。他に引数があれば、そのパッケージのnewメソッドに渡される。


◆入出力

_◇文字入出力関数
※getc
│ getc FH
│  FH:ファイルハンドル
│ FHから次の1文字を返す。
│ 例)
│ while( $char = getc STDIN ){
│  print $char, “\n”;
│ }

※printf

printf [FILEHANDLE] FORMAT, LIST

FORMATで指定されたフォーマットに従ってLISTを整形し、ファイルハンドルに出力する。省略すると、現在セレクトされている出力ファイルハンドルに出力されます。戻り値は、printfが正常に終了したら1、異常があったら 0 。

例)
printf “%02d”, 2;
> 02

※printfフォーマット指定子
%c 文字 -Character
%d 10進数 -Deximal
%e 浮動少数(指数形式) -Exponential
%E 浮動少数(大文字のEを使った指数形式)
%f 浮動小数(固定小数点形式) -Floating
%g 浮動小数(浮動少数または指数形式のうち、少ないスペースで表現できる方)
%G %g の指数表示をEにしたもの
%ld 倍精度10進数 -Long
%lo 倍精度8進数
%lu 倍精度符号なし10進数
%lx 倍精度16進数
%n すでに出力した文字数を次の変数に格納
%o 8進数 -Octal
%p ポインタ (16進数での値のアドレス)
%s 文字列 -String
%u 符号なし10進数 -Unsigned
%x 符号なし16進数 -heXadecimal
%X %x と同じだが大文字を使う

※修飾子
①-(%-nd) 左寄せで表示。n は文字列の長さ。
②# 8進の整数は0で始まり、16進の整数は0xで始まるように表示
③(%nd) 数値変数の10進展開。「n」は文字列の長さ。文字数が足りない場合はスペースで埋める。
④(%n.mf) 小数点付き数値の10進展開。n は文字列の長さ、m は少数点以下の桁数を指定。
⑤+(%+d) 符号付き10進展開。符号+または-をつけて表示
⑥0(%0nd) 文字数が足りない場合は0で埋める。n は文字列の長さ。

例)
# 現在日時を取得
( $sec , $min , $hour , $day , $mon , $year ) = localtime( time );
$mon++;
printf(“現在の日時は:%02d年%02d月%02d日の %02d:%02d:%02d です”, $year, $mon, $day, $hour, $min, $sec );
> 現在の日時は:96年01月03日の 09:03:02 です

※sprintf

sprintf FORMAT,LIST

FORMATで指定されたとおりに整形してから文字列を返す。

sprintf( “出力内容(%フォーマット文字)” , $変数1,$変数2,…);

※sprintfフィールド指定子

%m.nx
mとnは省略可能。ここでmとnはサイズをあらわし、フィールドのタイプに応じて解釈される。

例)
$num = 5;
print sprintf( “%02d”, $num );
> 05

%c 文字 -Character
%d 10進数 -Deximal
%e 浮動少数(指数形式) -Exponential
%E 浮動少数(大文字のEを使った指数形式)
%f 浮動小数(固定小数点形式) -Floating
%g 浮動小数(浮動少数または指数形式のうち、少ないスペースで表現できる方)
%G %g の指数表示をEにしたもの
%ld 倍精度10進数 -Long
%lo 倍精度8進数
%lu 倍精度符号なし10進数
%lx 倍精度16進数
%n すでに出力した文字数を次の変数に格納
%o 8進数 -Octal
%p ポインタ (16進数での値のアドレス)
%s 文字列 -String
%u 符号なし10進数 -Unsigned
%x 符号なし16進数 -heXadecimal
%X %x と同じだが大文字を使う

※修飾子
①-(%-nd) 左寄せで表示。n は文字列の長さ
②# 8進の整数は0で始まり、16進の整数は0xで始まるように表示
③(%nd) 数値変数の10進展開。「n」は文字列の長さ。文字数が足りない場合はスペースで埋める。
④(%n.mf) 小数点付き数値の10進展開。n は文字列の長さ、m は少数点以下の桁数を指定。
⑤+(%+d) 符号付き10進展開。符号+または-をつけて表示
⑥0(%0nd) 文字数が足りない場合は0で埋める。n は文字列の長さ。

mは、通常、フィールドの最小長(負なら左寄せ)。nは指数表示の場合には精度、文字列の場合には最大長、整数の場合には最小限表示する桁数を表す。フィールド内の空白を埋めるのに、通常は文字列ではスペース、数値では0が使われる。フィールドの長さに * を指定することはできない。

※warn
│ warn(リスト)
リストをSTDERRに出力する。

_◇ファイル入出力

※標準入出力
│ STDIN
│ STDOUT
│ STDERR

※ファイルのオープン
open(F,”PATH名”)
│ READ
open(F,”<PATH名”)
│ READ
open(F,”>PATH名”)
│ WRITE
open(F,”>>PATH名”)
│ APPEND
open(F,”$fnam”) or die(“ERR\n”);
│ オープンできなければ終了。

if( ! open FH , "$filename" ){
    # ファイルオープンエラー処理
    ....
}

※3引数の open
文字エンコーディングを指定できる

open IN, “<:utf8”, “fileName”;
open IN, “<:encoding(euc-jp)”, “fileName”;

※ファイルの読み出し
<F>
│ ファイルハンドルFから1行入力。リストコンテキストでは行の配列を返す。

※ファイルへの書き込み
print F “abc”
│ ファイルハンドルFに出力

※クローズ
close(F)

※eof
eof(F)
⇒F省略すると
│ eof():コマンドラインで指定したファイルを連結した状態を示す。
│ eof:最後に読み込んだファイルの状態を示す。

※ファイルテスト演算子
①読み込み可能か
│ if (-r ファイル名) { }
②書き込み可能か
│ if (-w ファイル名) { }
③実行可能か
│ if (-x ファイル名) { }
④存在するか
│ if (-e ファイル名) { }
⑤大きさが0か
│ if (-z ファイル名) { }
⑥ファイルか
│ if (-f ファイル名) { }
⑦ディレクトリか
│ if (-d ファイル名) { }

※ランダムアクセス
seek FH, OFFSET, WHENCE
│ FH ファイルハンドル
│ OFFSET バイト位置
│ WHENCE
│  0:ファイル先頭基準
│  1:現在位置基準
│  2:ファイル末尾基準
│ 例)
│ open(FH, $log);
│ seek(FH,2,0);

tell FH
│ FH ファイルハンドル
バイト単位のファイルポジションを返す。

_◇I/O演算子

① 山カッコ <ファイルハンドル>

STDIN, STDOUT, STDERRは予め定義済

<FILEHANDLE>がリストを必要とするコンテキストで用いられると、1要素1行で全行をリストにしたものが返される

※ヌルファイルハンドル <>
最初に配列@ARGVが調べられる
もし空なら $ARGV[0]に”-“が設定される⇒これを読もうとすると<STDIN>が読まれる
その後、@ARGVをファイル名のリストとして処理する。

while (<>) {
    ...
}

は、引数に与えられたファイルリストを次々とshiftしながら開いて読んでいくことと等価
⇒シンボル<>が偽を返すのは一度きり。偽となった後で、もう一度呼び出すと別の@ARGVを処理するものとみなされる⇒再設定されていなければ@ARGVは空になっているので”-“が設定され、STDINから読み込まれる

※行番号 $. はファイルリストが一つの大きなファイルであるかのようにカウントされる。

※<$foo> $fooがスカラ変数の参照であれば、その変数が入力を行うファイルハンドル名を示しているとみなされる

※<文字列>がファイルハンドルでなければ、グロブを行うファイル名のパターンと解釈される。

例)
while(<*.c>) {

_◇フォーマット
format 名前 =
フォーマットリスト
.

※名前を省略するとSTDOUT

※フォーマットリストはピクチャー行と引数行がある。

※ピクチャー行
│ @<<<… 左寄せフィールド
│ @>>>… 右寄せフィールド
│ @|||… 中央寄せフィールド
│ @##.## 数値フィールド
│ @* 改行を含む変数を出力
│ ^<<<… 行を適当に折り返す
│ ~^<<<…
│  空行は出力しない
│ ~~^<<<…
│  繰り返し使う

※my()で宣言された変数は見えない。

例)
foramt STDOUT =
@<<<<<<<<
$name
.

例)
format STDOUT =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word
.

例)
format STDOUT =
~~^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word
.

※write
│ フォーマット出力

※ヘッダ
ヘッダとして出力したいデータのフォーマット名に _TOP をつなげることで、そのファイルハンドルはヘッダと解釈される。

_◇バイナリデータ入出力

※binmode FH
ファイルハンドルFHをバイナリモードで扱う。

⇒既に開かれているファイルハンドルに対して PerlIOレイヤを指定できる
例)
binmode STDOUT, “:utf8”;
binmode IN, “:encoding(euc-jp)”;

※unpack
unpack TEMPLATE, EXPR
バイナリデータの構造体を含む文字列EXPR を受け取り、それをリスト値に展開して返えす。スカラコンテキストでは、最初の値を返す。TEMPLATEはpack関数と同じ。

※pack TEMPLATE, LIST
第2引数LISTをバイナリの構造体にパックしたものを文字列として返す。第1引数TEMPLATEはフォーマット文字を並べて、値の順番と型を示すようにしたもの。

※packフォーマット
a ASCII 文字列
A ASCII 文字列、足りない領域はスペース文字で埋める
b ビット列 (昇ビット順)
B ビット列 (降ビット順)
c 符号付き char 値
C 符号なし char 値
d 機種依存の倍精度浮動小数点数
f 機種依存の単精度浮動小数点数
h 16進数文字列 (下位ビットが先)
H 16進数文字列 (上位ビットが先)
i 符号付き int 値 (32bit)
I 符号なし int 値 (32bit)
l 符号付き long 値 (32bit)
L 符号なし long 値 (32bit)
n ネットワークバイト順序 (ビッグエンディアン) の short 値
N ネットワークバイト順序 (ビッグエンディアン) の long 値
p 文字列へのポインタ
P 構造体 (固定長文字列) へのポインタ
s 符号付き short 値 (16bit)
S 符号なし short 値 (16bit)
v VAXバイト 順序 (リトルエンディアン) の short 値
V VAXバイト 順序 (リトルエンディアン) の long 値
u uuencode した文字列
x ヌル文字
X 1バイト後退
@ 絶対位置までヌル文字で埋める

①フォーマット文字の後ろには、それを何回繰り返すかを示す数字を付加できる。
②数字でなく * を指定すると、残っているすべての要素という意味になる。
③フォーマット文字の間にスペースを入れてもよい。
挟むことができます。
③a、A、b、B、h、H以外のフォーマットは、第2引数LISTから指定回数分の要素をパックする。
④aやAの場合、繰り返し数で示す長さの文字列となるように、必要に応じてヌル文字かスペース文字を付け足す。unpackするときは、Aは後続のスペース文字やヌル文字を取り除き、aはそのままにする。
⑤bやBは、繰り返し数で示すビット長のビット列にパックする。
⑥hやHは、そのニブル長のニブル列にパックする。
⑦Pは、指定した長さの構造体へのポインタをパックする。
⑧実数 (floatとdouble) は、機種依存のフォーマットになる。

例)
print pack(“cccc”,65,66,67,68), “\n”;
print pack(“c4”,65,66,67,68), “\n”;
どちらも同じ
> ABCD

※binmode
binmode FILEHANDLE
バイナリファイルとテキストファイルを区別するOSにおいて、指定ファイルをバイナリで読み書きするように指定する。そうしたシステムでは、出力時には改行(\n)が復帰/改行(\r\n)に置き換えられ、入力時には復帰/改行が改行に置き換えられる。binmodeは、UNIX系OSでは何の効果もなく、DOSでは必須となる。 エラー時には、$!にエラーコードがセットされる。binmodeはopenの後、ファイルハンドルに対する入出力が行われる前に呼び出す。

例)
open(FH,$file);
binmode FH;

※read
read FILEHANDLE, SCALAR, LENGTH, [OFFSET]
readは、ファイルハンドルからデータを読み取る。第1引数のファイルハンドルから第2引数の変数に第3引数のバイト数分のデータを読み込む。第4引数OFFSETを指定すると、指定した位置から読み込みを行なうことができる。成功時には、実際に読み込まれたバイト数を返し、ファイルの終わり(EOF)の場合は0を返す。エラー時にはundefを返します。

例)

open ( FH, $file );
$line;
while( read( FH, $new, 1 ) ){
    $line .= $new;
}
print $line; 

⇒readは指定したLENGTHより多めに読み込むことがある。

※sysread
sysread FILEHANDLE, SCALAR, LENGTH, [OFFSET]
指定したFILEHANDLEから、変数 SCALARへ、LENGTHバイトのデータの読み込みを試みる。実際に読み込まれたデータの長さか、エラー時にはundefが返される。SCALARは、実際に読み込んだ長さに応じて、伸び縮みする。OFFSETを指定すると、SCALARの先頭以外の場所から、読み込みを行ないうことができる。stdioルーティンを通らないので、他の入力関数と混ぜて使うと、入力がおかしくなる可能性がある。

※syswrite
syswrite FILEHANDLE, SCALAR, LENGTH, [OFFSET]
指定したFILEHANDLEへ、変数 SCALARから、LENGTHバイトのデータの書き込みを試みる。OFFSETを指定すると、SCALARの先頭以外の場所から、データを取り出して、書き込みを行ないうことができる。OFFSETに負の値を指定すると、文字列の最後から逆向きに数えて何バイト目から書き込むかを示す。SCALARが空の場合、OFFSETはゼロのみ使用できる。実際に読み込まれたデータの長さか、エラー時にはundefが返される。LENGTHがOFFSET以降のSCALARの利用可能なデータより大きかった場合、利用可能なデータのみが書き込まれる。stdioルーティンを通らないので、他の出力関数と混ぜて使うと、出力がおかしくなる可能性がある。

_◇特殊ファイルハンドル DATA

Perlプログラムファイル中、__END__ もしくは __DATA__ というトークン以降、
ファイル末まではコードとしては実行されない。

DATA という特殊ファイルハンドルで参照することができるデータとなる。
<DATA>
として読み込むことができる

__END__
│ mainパッケージのDATAファイルハンドルに関連付けられる
__DATA__
│ 現在パッケージのDATAファイルハンドルに関連づけられる


◆ファイル操作

※unlink LIST
│ LISTに含まれるファイルを削除する。削除に成功したファイル数を返す。
│ 例)
│ $cnt = unlink ‘a’, ‘b’, ‘c’;
│ unlink <*.bak>;

※rename new old
│ ファイル名の付け替え。
│ 例)
│ rename( $new, $old );


◆コマンドライン引数

※配列として与えられる。
@ARGV

※個数(添え字の最大値なので個数-1)
$#ARGV

※参照
$ARGV[0] 最初
$ARGV[$#ARGV] 最後


◆シグナルの受信の宣言

$SIG{‘シグナル名’} = “受信時に実行される関数名”;


◆パッケージ
パッケージ内の名前は別空間となる。
パッケージ宣言を行わないと、デフォルトで mainパッケージとみなされる。

※package宣言

package パッケージ名;

サブルーチンの定義など

1;

※ファイルとして切り出したパッケージは、実行の準備が済んだことを Perl インタプリタに知らせるために、パッケージの最後で真(1)を返す必要がある。

※外部パッケージファイルの使用の宣言
require “パッケージ名.pl”;

requireは、useと異なりコンパイル時では評価されず、スクリプト実行時に評価される。

※パッケージ内のサブルーチンや変数の参照
他のパッケージ空間にある変数やサブルーチンを参照する場合には、パッケージ名とコロン(:)2つを、変数名やサブルーチン名の前に付加する。

例)
&pkg::func();
$pkg::value;

※パッケージ名なしで2つのコロンを置くと、main パッケージとなる。「$::value」は「$main::value」と同じ。


パッケージ名’名前

※BEGIN, ENDブロック
パッケージ内にBEGIN { }ブロックがあると、メインルーチンの実行前に実行される。また、END { }ブロックがあると、メインルーチンの終了後に実行される。


◆モジュール
use文は、スクリプト実行前のコンパイル時に実行され、モジュールで定義されているサブルーチンなどをインポートする。
use モジュール名;

use 文の引数に、インポートしたいサブルーチン名を指定できる。指定した場合は、それ以外のサブルーチンはインポートされない。

use モジュール名 qw(サブルーチン名1 サブルーチン名2);

※モジュールは、パッケージ名をファイル名として、拡張子は「 .pm 」。モジュール名は、先頭が大文字。


◆文字コード

euc-jp
shiftjis
iso-2022-jp


◎ライブラリ
環境変数PERLLIBで指定されたディレクトリやカレントディレクトリから検索される。(特殊変数@INC)

◆ローカルライブラリ

_◇MassaLib
require “MassaLib.pl”;

①count1s(int)
ビット表現での1の数を数える。
例)
printf(“%d \n”,&MassaLib::count1s(7));

②bitDistance(int1, int2)
ビット距離を求める。
例)
printf(“%d \n”,&MassaLib::bitDistance(7, 7));

◆IO::File
use IO::File;

例)オープン、クローズ
my $io = IO::File->new();
$io->open(‘test.txt’, ‘r’) or die $!;
print <$io>;
$io->close;

例)
my $io = IO::File->new(‘test.txt’, ‘r’) or die $!;

例)1行読み込み
<FH>書式
$line = $io->getline;

◆XML::Simple

XMLからPerlデータ構造(無名ハッシュと無名配列)変換
Perlデータ構造からXMLテキスト文書への再変換

_◇コンストラクタ

XML::Simple->new()

例)
my $simple = XML::Simple->new();

_◇XMLin()
XMLファイルを読み取って参照を返す
コンストラクタにより構築されたXML::Simpleを$simpleが指しているならば

$変数 = $simple->XMLin(‘xmlファイル名’);

で読み取ることができる。xmlファイルを省略すると、スクリプトと同じファイル名の.xmlファイルを開く

※参照を変数に代入すれば,XML要素に
│ $変数名->{要素名}
でアクセスできるようになる

_◇XMLout()
データ構造への参照を受け取って、文字列またはファイルとしてXML文書に変換する

※オプションを指定しないと文字列が生成される

※ファイルに書き込む場合は、OutputFileオプションを使用する。
※オプション指定が無いとルート要素として<opt>が使用される。
※ルート要素がある場合は KeepRootオプションを追加する

例)

$simple->XMLout($data, 
            KeepRoot   => 1, 
            OutputFile => 'pets.fixed.xml',
            XMLDecl    => "<?xml version='1.0'?>",
        );

_◇使用例

part1.xml)

<config>
  <user>freddy</user>
  <passwd>longNails</passwd>
  <books>
    <book author="Steinbeck" title="Cannery Row"/>
    <book author="Faulkner" title="Soldier's Pay"/>
    <book author="Steinbeck" title="East of Eden"/>
  </books>
</config>

part1.pl)
use strict;
use XML::Simple;
use Data::Dumper;
print Dumper (XML::Simple->new()->XMLin());

◆DBI

_◇DBIオプション

※connectメソッドの第4引数としてDBIのオプションを指定することができる

DBI->connect($data_source, $user, $password, {opt1 => $val1, opt2 => $val2, ..});

オプション例)
PrintError => 0
│ 警告を出力しない
RaiseError => 1
│ エラーメッセージを出力して終了させる
AutoCommit => 1
│ 自動的にコミットする

◆DBD::SQLite
Self Contained RDBMS
DBIドライバ

_◇使用の宣言

データベースに接続する

use DBI;
my $dbh = DBI->connect(“dbi:SQLite:dbname=ファイル名”,””,””);

例)

use DBI;
my $f="c:/pgm/var/shop.db";
my $source = "dbi:SQLite:$f";
my $user = "";
my $password = "";

my $dbh = DBI->connect(
    $source, $user, $password
);

※データベース名を「:memory:」とすることでメモリ上にデータベースを作成することができる
⇒データベースを切断するとテーブルは自動的に消去される

例)
my $dbh = DBI->connect(“dbi:SQLite:dbname=:memory:”);

_◇doメソッドによる直接実行
select文以外に適用できる

例)

my $create_table = "create table books (" .
                       "title," .
                       "author" .
                   ");";

$dbh->do($create_table);

_◇select文の実行方法

①prepareメソッドでSQL文を準備する
⇒ステートメントハンドルが返される
②executeメソッドで実行する
⇒ステートメントハンドルからexecuteを実行する

例)
my $select = “select * from books;”;
my $sth = $dbh->prepare($select);
$sth->execute;

※select文の結果の取得
fetchrow_arrayメソッドによる

例)

while (my @row = $sth->fetchrow_array) {
    # 必要な処理
}

※fetchrow_hashrefメソッドによる

例)

while ( my $ref = $sth->fetchrow_hashref() ) {
    print "id:$ref->{id} title:$ref->{title}\n";
}

_◇データベースの切断
$dbh->disconnect;

◆Data::Dumper
データ構造の出力

_◇Dumper(LIST)
渡されたリストの値を文字列化して返す。
値の名前には$VARnが使われる


◎サンプル

◆TEST CODE

_◇DBM CHECK

@DB = ( "NDBM_File" # NDBM
      , "DB_File" # Berkeley DB
      , "GDBM_File"  # GNU DBM
      , "SDBM_File"  # SDBM
      , "ODBM_File"); # ODBM

foreach $mod ( @DB ){
    if( eval "require $mod" ){
    print $mod,"\n";
    }
}

◆Sample CODE

_◇特定文字の消去

while (<>) {
    chomp;
    s/_//g;
    print "$_,\n";
}


◎インタプリタ

◆コマンドラインオプション

①-h
コマンドラインオプションの一覧を表示する

②-v
バージョンを表示する

③-e
指定された文字列をプログラムとして実行する

例)
perl -e ‘print “hogehoge”‘

④-n
与えられたプログラムの外側に以下のようなループがあるように動作する。-eオプションと組み合わせると便利

while(<>) {
  ....
}

⑤-p
与えられたプログラムの外側に以下のようなループがあるように動作する。-eオプションと組み合わせると便利

while(<>) {
  ....
  print $_;
} 

例)
perl -p -e ‘s/正規表現/置換/’

⑥-l
-n, -pなどのループの先頭でchompを行う。

⑦-i[.ext]
オリジナルファイルを.extなる拡張子でバックアップし、オリジナルファイルを編集する。多くのファイルに対して同じ処理を行うときに便利。

例)
perl -i.bak -p -e ‘s/#ffffdd/#aaaacc/ig;’ *.html
※全ての.htmlファイルのオリジナルを.bakとして残し、#ffffddを#aaaaccで置換する。

⑧-w および -c
-cは構文チェックと初期化のみ行い実行しない。-wは各種の警告を出力する。通常は-wcのように両方を指定する。

例)
$ perl -wc t.pl
※警告があれば出力される。

⑨-d
デバッガを起動する。詳細は「デバッガ」参照。

例)
$ perl -d t.pl

◆デバッガ

①ヘルプ
h 短いヘルプサマリを表示する
h h 長いヘルプを表示する
h xxx xxxコマンドのヘルプ

②リスト
l リストを表示する
l m+i m行からi行分表示
l m-n m行からn行まで表示
l m m行を表示
l xxx サブルーチンxxxを表示

③ステップ実行
n 1行実行、以下Returnで繰り返し
│ (サブルーチンは1行として実行)
s 1行実行、以下Returnで繰り返し
│ (サブルーチン内もステップ実行)
r サブルーチン内を処理して戻る

④ブレークポイント
b 現在行にブレークポイントしかける
b m m行にブレークポイント
│ ※条件をさらに指定することもできる。
│ 例) $i==1
b xxx サブルーチンxxx先頭にブレークポイント
│ ※条件をさらに指定することもできる。

b $var 変数$varの参照にブレークポイント

⑤ウオッチ
w expr グローバルなウオッチを追加
< expr プロンプト前に実行されるperl命令
<< expr プロンプト前に実行される命令に追加
< ? プロンプト前実行命令群の確認
< * プロンプト前実行命令群の消去
a m command
│  m行を実行前にcommandを実行
A aによるウオッチを無効にする。m行を与えるとm行のみ無効化。
W * wによるウオッチを全て無効にする。*でなくexprを与えるとexprのみ無効化

⑥連続実行
c [m|sub] 実行する。m行もしくはsub名を指定すると一時的なブレークポイントが設定される。

⑦command
そのパッケージ内でperlのcommandを実行する

⑧T, t
T スタックトレース。サブルーチンの呼び出し関係を見ることができる。
t トレースモードをトグル

⑨=
コマンドエイリアスの定義

⑩!, H
!xx 過去のコマンドxxの再実行
H コマンドヒストリ表示

⑪L [a|b|w]
ブレークポイント、ウオッチポイントなどの確認

⑫S
サブルーチン名のリストアップ

⑬^C
デバッガモードで^Cすると、その時点で実行していた部分を表示して戻る。(無限ループの解析に便利)

◆PPM


◎Tips

◆1行スクリプト

_◇インクルードパスの表示

perl -le “print foreach @INC”

_◇置換

perl -p -e ‘s/正規表現/置換/’


◎perlの実行方法

①perl ファイル名 引数…

②Unix系システムでのファイルの直接実行
│ 先頭 #!/usr/bin/perl
│ (パスを指定)
│ chmod +x ファイル名で実行可能属性をつけておく

③コマンドラインオプション

│ -e ‘プログラム’
│ (短いプログラムを指定)
│ 例)
│ perl -e ‘print “Hello.\n”;’

│ -n
│ while(<>){ }として実行
│ 例)
│ perl -n -e ‘print;’は、
│ perl -e ‘while (<>) {print;}’
│ と同じ

│ -p
│ 「-n」でさらにprint
│ ループの最後で自動的に$_を