起動など
|
●第一行目
#!/usr/bin/perl or #!/usr/local/bin/perl (分からなかったら which で調べるといい)
-w オプションを指定すると、ワーニングメッセージが表示される。
●コメント → # (行の途中からでもOK)
●変数・配列宣言
→ いらない、すべてグローバル変数扱いとなる。
→ ローカル変数を指定したいときは、 my ($a, @b) とする。 ブロックの中で有効 sub, foreach など。
→ use strict を使うと、必ず変数宣言が必要となる。
●文の終わり → " ; " セミコロンをおく
●Hello World Program
#!usr/bin/perl
print "Hello, World!\n";
●起動引数
@ARGV に格納される。
●終了(エラーコード発生)
die "Cannot create logfile....";
|
スカラー・リストデータ
|
●スカラー変数
$abcdef <= 大文字、小文字は区別するので注意 アンダースコア( _ )は使用OK
●文字列:
シングルクオート( ' ' )か、ダブルクオート ( " " )で囲む。
ダブルクオートの場合は逆スラッシュエスケープが使える。また変数展開もできる。
●変数と文字列の表記
print ("answer".(2+3));
●リスト
@abcdef: リスト全体を表す
$abcdef[**] 配列要素
($abc, $def, $ghi) リストの表し方
qw { abc, def, ghi } 文字列をクオートなしでリスト化する方法、 [ ], / /, ( ), # # で囲んでもOK
●リストをスカラーでうける。 => リストの要素数が返される。
●リストの最終インデックス。(スカラー値) => @list に対して、 $#list を使う。(インデックスは0から始まる)
●リストを使った変数変換
($abc, $def) = ($def, $abc)
●範囲をリストに突っ込む方法
@abc = 1..100 : 注 リスト要素は 0から始まる。
●逆スラッシュエスケープ:
\n
|
改行 (LF)
|
\r
|
復帰 (CR)
|
\t
|
タブ
|
\b
|
バックスペース
|
\cC
|
コントロール文字(この場合 control+C)
|
\\
|
\
|
●ハッシュ
値 -> $variable { "name" } <=中カッコで指定、キーはクオーテーションを忘れずに
配列全体 -> %variable
代入(2通り) %variable = ("x1", "y1", "x2", "y2".....)
%variable = ("x1" => "y1", "x2" => "y2", ...)
|
入力・出力1
|
●<STDIN>: 標準入力 ただし改行文字がついてしまうので chomp 演算子で捨てたほうがいい。
$line = <STDIN>;
$line = chomp($text = <STDIN>);
☆配列の場合は、Ctrl+D (Winは Ctrl+Z) を押すまで値を吸い込み続ける。
●起動引数をファイルとして読み込む場合
<> (ダイアモンド演算子)を使う
たとえば、
while (<>) { chomp; print "$_"; } <= ファイルを1行ずつ読み取る(改行コードまで読み取るのでchomp
● print <= 演算子でもある。 $result = print (2+3)*4; は 5を表示し、戻り値は 4になる。
● printf <= 書式つき出力
printf "abcd %g efgh %s", $value, $string;
%c
|
文字
|
%d
|
10進数整数(切り捨て)
|
%e, %E
|
小数(指数形式)
|
%g, %G
|
小数(指数形式の使用有無を自動切換え)
|
%s
|
文字列
|
%u
|
符号なし10進数
|
|
|
-%3d
|
左寄せ(-), 3桁の10進数
|
(%3d)
|
文字数が足りない場合はスペースで埋める
|
(%3.5f)
|
小数点つき10進数展開
|
(%03d)
|
文字数が足りない場合はゼロで埋める
|
|
入力・出力2(ファイルハンドル関係)
|
● open
使用例) 入力) open IN, "filename"; open IN, "< filename";
出力:上書き) open OUT, "> filename"
出力:追加) open APPEND, ">> filename";
注) IN, OUT, APPEND は以後print 文などで reference として用いられる。自由に名前をつけられる。
● close: クローズ
● ファイルテスト
真偽の値を返す。
例) open IN, "x.dat";
unless (-e){print "error\n"};
-e
|
ファイル・ディレクトリーが存在する
|
-s
|
ファイルが存在する(ディレクトリーは常に偽)
|
-M
|
最後に変更されてからの日数
|
-A
|
最後にアクセスされたからの日数
|
|
ディレクトリー・ファイル操作
|
● 作業ディレクトリーの変更: chdir "/home"; # シェルのディレクトリーが変更されるわけではない
# (~)をホームディレクトリーとして代用することはできない
● 対象ディレクトリーのファイル名検索
opendir DH, "/etc";
foreach $filename (readdir DH) {
print "$filename \n"; }
注) readdir DH, ファイル名のみを返す。 ディレクトリーのパスは返さない。
● ファイル削除・移動
unlink "$filename", "output";
$z = unlink "$filename"; ← 削除したファイル数を返す。
● グロブ
glob "*.out" -> *.out 一覧
例えば、 unlink glob "*.out"; とすることもできる。
|
演算子・組み込み関数など
|
**
|
べき乗
|
%
|
剰余 (オペランドは小数点以下切り落とし)
|
++, --
|
オートインクリメント(デクリメント)
|
. (ピリオド)
|
文字列の足し算
|
x (small x)
|
文字列の掛け算 (前のオペランドが後ろのオペランド倍される)
|
$x =+ 3
|
3 をオートインクリメント
|
|
|
超越関数
|
cos, sin, exp, abs, log, sqrt (三角関数はラジアン入力)
例) $z = sqrt (2)
|
|
|
論理演算子、比較演算子
比較
|
数値演算子
|
文字列演算子
|
正規表現に対する演算
|
等しい
|
= =
|
eq
|
=~
|
より小さい
|
<
|
lt
|
|
より大きい
|
>
|
gt
|
|
等しくない
|
!=
|
ne
|
|
より小さいか等しい
|
<=
|
le
|
|
より大きいか等しい
|
>=
|
ge
|
|
アンド
|
&&
|
|
オア
|
||
|
|
=<,, => の記法は使ってはならない
組み込み関数・演算子(文字列操作)
chomp
|
スカラー: 文字列末の改行文字を切り捨てる
リスト: 要素末の改行文字を切り捨てる
|
|
pop
|
リスト: 配列末尾の値を返して、配列から消去する
|
$abc = pop @abc; @abcの最後の要素が$abcへ。
pop @abc; :最後の要素がなくなるだけ
|
push
|
リスト: 配列末尾に値を加える
|
push (@abc, 0)
push (@abc, @def), 不要: @abc = push (@abc, ...)
|
shift
|
リスト: 配列先頭の値を返して、配列から消去する
|
|
unshift
|
リスト: 配列先頭に値を加える
|
unshift (@abc, 0)
|
reverse
|
リスト: リスト要素の順番を逆転させる
スカラー: 文字列を逆転させる
|
list: (abc, def, ghi) -> (ghi, def, abc)
scalar: (abc, def, ghi) -> ihgfedcba
|
sort
|
リスト: 要素をASCII文字列順で並び替える
スカラー: 文字列としてソートする
|
@abc = sort (@abc)
(注: sort (@abc) だけではソートされない)
|
scalar
|
リスト: スカラー扱いを強要(要素数を返す)
|
|
keys
|
ハッシュ: キーの全てのリストを返す
|
|
values
|
ハッシュ: 値の全てのリストを返す
|
|
delete
|
ハッシュ: キーと値を消去する
|
|
exists
|
ハッシュ: 値があれば真を返す。
|
exists ($abc{"ichiro"})
|
split
|
正規表現を参照: 文字列を分解
|
|
join
|
文字列を任意の文字で結合
|
$z=join "-", @values;
例) @vaslues= (1,2,3,4) -> $z="1-2-3-4"
|
index
|
index ($big, $small);
$big中で$small を含む文字列を探して、$big中での最初の位置(インデックスを返す)
インデックスは0から始まる。 見つからない場合は -1 を返す。
|
rindex
|
indexに対して、最後のインデックスを返す。
|
|
制御文
|
●if (条件) {文}
●if (条件) {文} else {文}
●if (条件) {文} elsif (条件) {文}....
注) elseif ではない、 elsif
式修飾技法: print "result => $n" if $n < 0;
●unless (条件) {文}; ifの逆、 条件が偽であれば文を実行
●unless - else もあり。
●while (条件) {文} ; 条件が真である限り続ける (条件の評価は文の前)
$count = 0 ;
while ($count <= 10) { $count + = 1; print $count;}
●utill (条件) {文}; 条件が偽である限り続ける
●foreach 制御変数 (リスト) { }
制御変数がリストの要素そのものになっていることに注意。制御変数を変えるとリストの中身も変更される。
foreach $abc (qw/ ichiro jiro saburo /) {print $abc};
foreach $abc (@abc) {$abc = pop(@abc)}; #この場合、 @abcのすべての要素は末尾の文字しか残らなくなる。
●for文
例) for ($i=-150; $i <= 1000; $i += 3) {文} +=はインクリメント 1増やすときは $i++ でよい。
● { 文 } ← スコープ中ではローカル変数宣言 my が使える。
● 演算子
last 演算子 ループを抜け出す。 if と サブルーチンの{ }間は対象にならない。内側のブロックのみに作用。
next 演算子 現在のループの末尾に飛ぶ
redo 演算子 現在のループブロックの先頭に飛ぶ
● ラベル xxx: while (...) {...} : xxxがラベルになる
●ループの終了: last(ループから抜ける) next (現在行なっているループ文を終了)
|
サブルーチン
|
●文型
sub subroutine_name { }
引数は @_ リスト($_[0], $_[1],.....)に格納される。
●返り値
最後の行の値を返す。あるいは、return のある行の値を返す。 return $_ ; など
●サブルーチンへの飛び方と引数
&subroutine_name ($a, $b)
& は、組み込み関数と一致しておらず、前文に組み込みのサブルーチンなら不要。
|
子プロセス
|
● 子プロセスの起動 : system "ls -al";
● 子プロセスの出力を格納するとき : @results = ` 逆スラッシュで囲む ls -al `;
|
正規表現
|
● 表式 → /abcd/ or m// (mはデリミタを変えることもできる)
●メタキャラ・文字クラス・ショートカット
.(ピリオド)
|
1文字のワイルドカード (\n を除く)
|
|
*
|
直前の文字が0回以上マッチすること。 \t* (タブが0回以上)
|
|
.*
|
ワイルドカード(文字数制限なし)
|
|
+
|
直前の文字が1回以上マッチすること。
|
|
?
|
直前の文字があるかないか
|
a-?b => ab or a-b
|
{8}
|
直前の文字が8文字続くこと
|
|
{5,10}
|
直前の文字が5-10文字続くこと (上限、下限を省略可)
|
|
( ) カッコ
|
*, +, ?, { , }の範囲決め
記憶 /(x)\2/ 同じ文字が更に2つ続く (xxx)
|
(abcd)+ => abcdabcd
|
| 縦棒
|
選択(or) カッコで範囲を決めて使うとよい。
|
(ab|cd) => ab or cd
|
|
|
|
[ ]
|
[ ]内に含まれる文字を含む。 [abc], [a-zA-Z]など
|
|
\d
|
[0-9]と等価
|
|
\w
|
[A-Za-z0-9_]
|
|
\s
|
[\f\t\n\r ]
|
|
\D, \W, \S
|
\d, \w, \s の否定
|
|
|
|
|
^xxx
|
文字列の先頭に xxx があること
|
|
xxx$
|
文字列末尾に xxx があること
|
|
\bxxx
|
ワード先頭に xxx があること (注: -, _ などの記号は無視)
|
|
xxx\b
|
ワード末尾に xxx があること
|
|
|
|
|
/s
|
. (ドット)を全ての文字にマッチする。(改行文字含む)
|
|
/i
|
大文字、小文字区別せずにマッチング
|
|
● マッチ変数1
パターンに含まれるカッコに対応して、 $1, $2, $3.... があてがわれる。
不要な", "などを省くことができる。
/(\S+), (\S+), (\S+)/ で " 0.3, 0.4, 0.6"の文字列が、 $1=0.3 $2=0.4 $3=0.6 としてあてがわれる。
注: マッチに成功しないと、前のマッチ変数が残ってしまう。:なるべく、 if , while 文で使うべき。
● マッチ変数2
マッチした変数は $&に、その部分より前の文字列を $', 後方を $`に格納する。
● 置換 s/// => 例: s/abc/def/ で abc が defに置き換えられる。(置換は1回しか行なわれない)
$_ が入力文字列 → $_ で返される。
s.///は値を返す: 成功で真、失敗で偽
s///gにすると、置換は可能性のある全ての語句が置換対象となる。
先頭の空白文字を空文字化する s/^\s+//;
後方の空白文字を空文字化する s/\s+$//;
● 大文字と小文字の変換 s///中で、\U, \L などを用いる。
● split 演算子 → tab (\t), space (\s), コロン(,) で区切られたデータを分割する
@fields = split (/:/, "abc:def:g:h"); # @field = ("abc","def","g","h")
注)先頭の空フィールドは返される。末尾は返されない
空白文字でスプリット: @fields = split /\s+/, $some_input;
注)先頭の空白文字もスプリットの対象となり、リストに格納されてしまう。
デフォルトスプリット: @fields = split; $_ を空白文字でスプリットする。
注)先頭の空白文字はリストから削除される。
|