Perl

Perlメモ


`…`
コマンドを実行できる
$date=`date`; #変数にはコマンドの実行結果が保存される
print $date; #2012年 11月 13日 火曜日 ...

wantarray
戻り値として要求されているのが配列か、スカラーかを判定する
my @aray=test_wantarray(@hoge);
my $scalar=test_wantarray(@hoge);
sub test_wantarray{
 #wantarrayは、配列が求められてるなら真を、スカラーなら偽を返す
 wantarray?@_:scalar@_;
}

//
defined-or演算子。通常のor(||)演算子と異なり定義されているかで真偽を判定してくれる




特殊変数

$!
エラーメッセージ,エラー番号
or dieの際のメッセージとして使用
$?
systemでの子プロセス,`…`でのコマンド実行,パイプを閉じたときのプロセス終了値
$&
正規表現でマッチした文字列全体
$1~3までが存在しているようなパターンマッチにおいて、$1.$2.$3を返す
より正確には対象文字列において、最も前でマッチしたパターンから最も後ろでマッチしたパターンまでの文字列を返す
例えば$1と$2の間にマッチしない文字がある場合でもそれを含めた文字列を返す
$+
正規表現でマッチした最後の文字列
正規表現でのOR(|)でどちらのパターンにマッチしたかなどを見るときに使用
$'
正規表現でマッチした文字列部より後にある部分
$`
正規表現でマッチした文字列部より前にある部分

正規表現オプション

x
パターン内の空白を無視する
パターン内に空白等があってもそれを評価しない。コメントをパターン内にかけるようになる。空白を評価は\sを使用すればよい

g
マッチングの終了位置を保存する
whileとセットで文字列内のパターンにマッチする箇所を全部取ってくるなどができる
print "$1\n" while(/\d+/g); #文字列内の全正数をとってこれる

\G
gオプションで保存される終了位置を示す
$test=~s/\G /0/g #$test内の先頭部で連続する空白を0に置換(終了位置の次が空白ならそれを0に置換を繰り返す)

c
gオプションの結果を維持する
gオプションでは一つのパターンマッチングで終了位置がリセットされる
cオプションを使えば次のパターンマッチングの段階でも続きからパターンマッチを行える

正規表現tips

[ -~]
スペースからチルダまでのセット、印刷可能な半角英数と記号を示す

quotemeta
文字列内の正規表現の特殊記号をエスケープしてくれる関数
正規表現において、「?」,「.」,「*」,「+」などの特殊な意味を持つ記号をエスケープしてくれる関数
パターンを外部からの入力で与える場合は、とりあえずは、これで変換した後、パターンとして与えた方がよい

日本語のパターンマッチについて

$test=~m/パターン/;
において、$testが外部入力(ファイルなり、標準入力なり)から与えられた文字列の場合には、decode_utf8を行う必要がある。
外部から入力された文字列はutf8にencodeされたものであり、外部が入力された者同士のマッチングでないならば、decodeする必要がある。
当然、それを外部に出力するときは、encodeしなおした方がよい
出力時のencodeしてある、してないの対応が取れてない文字列を出力すると文字化けが起こる
なお、quotemetaに投げるタイミングは、decode後でないと正しくエスケープされない

タグ:

+ タグ編集
  • タグ:
最終更新:2013年01月11日 15:07