参考文献
- Perl基礎文法最速マスター
- ミニマル perl
スクリプトを書く時
- プラグマ
- 推奨 : スクリプト先頭に書く
use strict;
use warnings;
1文字でも減らしたい
- print のデフォルト引数は、 $_
- print $_; したいだけなら書く必要ない。
用語
レコード
- 1つのまとまりとして読み書きされる文字の集合
- 入出力の際、ファイルはレコードの集まりと見ることができる。 この時、デフォルトでは、1行がレコード。
入力レコードセパレータ
- 入力レコードの終端区切りを表す文字、または文字シーケンス(文字の並び)。
- Linuxとかでは、デフォルトではラインフィード。
- Perl ではOS固有の入力レコードセパレータを n として、参照できる。
ニューライン
- n のこと。
- OS固有の入力レコードセパレータ。
スイッチ引数
- -s オプション
- 良い感じのコマンドラインオプションを取ることができる。
- 引数の与え方で2つの方法がある。
-foo='test' #=> $foo == 'test'
-foo #=> $foo == true : -debugで、デバッグ用、みたい使う。
- スイッチ引数を任意にしているスクリプトでは、冒頭にour関数を使うのが良い。
our($foo);
our($foo, $bar, ...);
真偽値
偽になるのは、次の3パターンある。
- 数値
- 0 と同等な値
- 文字列
- null文字列
- 0 を保持する文字列 ( '0' みたいな)
- 変数 : 値を持たない変数
- まだ設定されていない変数とか。定義されているかは、 defined を使うとわかる。
特別な文字列
$/, $\
- 入力,出力レコードセパレータを指定する
$.
今読んでいる入力レコードが何番目か、を表す
通常は行数
コマンドラインオプションや$/で、入力レコードセパレータを指定したときは、行数じゃなくなる
複数のファイルを読んでいる場合、ファイルをまたいで番号付けらられる
以下のようにすることで、ファイルごとに $. の値をリセットできる
# 各ファイル終了時にレコードカウンタの $. をリセット eof and close ARGV
$_
- 最後に読み込んだ入力レコード。
$"
- ダブルクォートで囲んだ配列の各要素の間に挿入される文字
- デフォルトはスペース
$,
print 文の2種類の特殊なフォーマット処理に利用
- print の引数を区切るコンマの代わりに出力で使用される
- クォートされていない配列やハッシュの要素の区切り
デフォルトは空文字
$&
- マッチした文字列の表示
$`
- マッチしたレコード中で最後のマッチの開始部分の前の部分、を保持
$'
- マッチしたレコード中で最後のマッチの末尾の後の部分、を保持
ARGV
- 現在の入力ソースのファイルハンドル。
- 特にクローズのために使われる。
$ARGV
- n, p オプションや空の入力演算子を使用すると、ファイル名が格納される。
- STDIN の時は、 - が表示される。
@ARGV
- n, p や入力演算子を使わないときに、自前でプログラムの引数にアクセスするために使う。
<>
\n
- OS 固有のレコードセパレータ
変数
$var : 変数
- 宣言と代入
my $var = 'aaa'
- '' と ""
- シングルクォートとダブルクォートの違いは、変数が展開されるかどうか。
- join (.), split, length, substr, index
@array : 配列
- 宣言と代入
my @array
@array = (1,2,3)
- $array[0] などとして、各値を得る
- $array[-2] というようにすれば、最後から2番目の意味
- pop, push, shift, unshift も使える
- 配列の大きさを得るのは、
$array_size = @array
などとする
%hash : ハッシュ
- 宣言と代入
my %hash; %hash = (a => 1, b => 2);
- $hash{a} などとして、各値を得る
- keys, values, exists, delete
制御構文
if { ~ }
if { ~ } else { ~ }
if { ~ } elsif { ~ }
while ( 条件 ) { ~ }
for ( my $i =0 ; $i < 5 ; $i++ ) { ~ }
foreach my $field (@fields) { ~ }
- 配列の各要素に対して何かを行う
- foreach は for のエイリアスらしい。
比較演算子
文字列比較
- $s eq $t
- $s ne $t
- $s lt $t
- $s gt $t
- $s le $t
- $s ge $t
サブルーチン : 関数
他の言語との違いは、
- 引数を関数宣言に書かない
- @_ を使って引数にアクセス
sub sub {
my ($num1, $num2) = @_;
my $result = $num1 - $num2;
return $result;
}
BEGIN, END
| 入力の処理の前や後に、処理を行う。 | BEGIN は、Usage の表示に使ったりする。 | END は、全体の結果・統計の計算・表示に使ったりする。
BEGIN { statements; }
END { statements; }
文字列修飾子
以下の2箇所で使える。
- ダブルクォート中の文字列
- 置換後文字列フィールド
文字列修飾子
修飾子 効果 =========== ========================================================== \U 右側の文字列を、\E または文字列の末尾まで、大文字に変換 \u 右側の文字を大文字に変換 \L 右側の文字列を、\E または文字列の末尾まで、小文字に変換 \l 右側の文字を小文字に変換 \E 変換を終了
論理演算
and, or
and の方が or より優先度が高い。
$one or $two and $three
# => $one or ( $two and $three )
!
論理否定。
関係演算子
+——————————————————–+ | 関係演算子 | +========================================================+ | 数値 文字列 意味 | +——————————————————–+ | ========= ================ =========================== | +——————————————————–+ | == eq 等しい | +——————————————————–+ | != ne 等しくない | +——————————————————–+ | > gt より大きい | +——————————————————–+ | >= ge 以上 | +——————————————————–+ | < lt より小さい | +——————————————————–+ | <= le 以下 | +——————————————————–+ | <=> cmp | 比較 | +——————————————————–+ | > | -1 : 左辺が小さい | +——————————————————–+ | > | 0 : 等しい | +——————————————————–+ | > | 1 : 左辺が大きい | +——————————————————–+
以下は、組み込み関数
IOに関連する関数
STDOUT に出力する
printf
- print のニューラインなしバージョン : -l の影響を受けない
- 他にもたくさん使い勝手が良い
warn
STDERR にメッセージを送る。
# 出力メッセージのあと、更にエラー行が付加される。
warn "msg\n"
# \n を入れると簡潔なエラーメッセージ : エラー行などを表示しない。
warn "msg\n"
print STRERR "a", "b"
die
| STDERR にメッセージを送って、プロセスを終了する。 | 出力メッセージの形式は warn と同様。 | デフォルトのエラーコードは255。
# BEGIN ブロックの外で
die "$0 : msg\n"
# BEGIN ブロックの中で
$success or warn "msg\n" and exit 255;
close
| ファイルハンドルを引数に取って、ファイルを閉じる。
close ARGV
eof
| 現在のファイルを最後まで読み込んだら、真を返す。
# 各ファイル終了時にレコードカウンタの $. をリセット
eof and close ARGV
dbmopen, dbmclose
flock
format
文字列操作
chomp
chop
chr
crypt
hex
index
lc, lcfirst, uc, ucfirst
- それぞれ \L, \l, \U, \u
length
- 文字列の長さ
substr
- 文字列の切り出し
- 添字は 0 から始まる
# 文字列先頭から、4文字目まで
substr $_, 0, 3;
その他
defined
undef
dump
eval
formline
time, gmtime, localtime
local
pos
scalar
reset
system
comments powered by Disqus