## Perl の正規表現(仮題)
#### 講師:USP友の会 鳥海秀一
### Perlワンライナー入門(全2回)
* 第1回:Perlワンライナー入門
* 第2回:Perl正規表現入門
### 改題の理由
* 午前の部は初心者むけのはず
* Perlの正規表現の部分だけの解説は不親切
* 講師の勉強が間に合わなかった
#### 講師: 鳥海秀一
* Perl歴:0年
* こんな講師でごめんなさい
### 講義を始める前に
### 解決しなければなら
### ないある疑問が…
### シェル芸の定義
マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。あるいはそのときのコマンド入力のこと。
### シェル芸にPerlってありなの?
* ありです
* 何かの縛りが欲しい方はご自由に
* disっているわけではありません
* 何らかの制約は時に有用です
### シェル芸にルールはないの?
* 最小限主義のルールはあるかも(講師の感想)
### 最小限主義?
* ここでは問題にあった最小限の道具を使うと格好よいという意味
* grepで済む問題に対しては、grepを
* sedで済む問題に対しては、sedを
* awkで済む問題に対しては、awkを使う
* 必然的にPerlは最後の方の選択肢
### Perlはいつ使ったら良いの
* 前回のシェル芸勉強会の問題とかに使ったら良いのではないでしょうか(講師の感想)
シェル芸午前の部
### Perlワンライナー入門
#### 講師:USP友の会 鳥海秀一
### 講義の前提
* 何らかのプログラミング言語を知っていることを前提とします
### 参考書
* プログラミングPerl(オライリー・ジャパン)
* はじめてのPerl(オライリー・ジャパン)
* ミニマルPerl(オライリー・ジャパン)
### Perl言語とは
* 1987年に登場
* ラリー・ウォールによって開発
* 「実用的なデータ取得レポート作成言語」または
* 「病的折衷主義のガラクタ出力装置」の略語とされる
* 最新のバージョンは6
* 一般的にPerlといった場合はバージョン5系のこと
* 午前の勉強会でもPerl5を扱う
### Perlワンライナーの書き方
* perl -[eE以外のオプション] -e '_code_'
* perl -[eE以外のオプション] -E '_code_'
### Perlを記述するときの注意点
* スカラー変数の前には$が必要
* リスト変数(配列)の前には@が必要
* 丸括弧は省略可能な場合が多い
* if文、while文、for文のあとのブレスは省略不可
* 単文には後置制御文を使う
* 改行は文の区切りにならない(;を使う)
* 最後の文の後の;は省略可能
* コンテキストを意識する必要がある
* bool型は存在しない
### コンテキスト
* 操作の振る舞いを変化させるスクリプト中の位置のこと
* Perlには次の2種類のコンテキストがある
* スカラーコンテキスト
* リストコンテキスト
### bool型は存在しない
* Perlが偽と評価する値は次の通り
* 空文字列
* 文字列の"0"
* 数値の0
* 偽以外は全て真
### ワンライナーを支援するPerlの機能
* 未定義の変数が使用可能
* ダイヤモンド演算子
* 豊富な特殊変数
* 豊富な起動オプション
* 強力な正規表現(次回に解説)
### 未定義の変数が使用可能
* まだ1回も値が代入されていない変数が使える
* 初期化されていない変数の値はコンテキストによって変わる
* 文字列としては空文字列
* 数値としては0
* bool値としては偽
* 警告が欲しい方は、wオプションをどうぞ
### ダイヤモンド演算子
* Unixのコマンドの振る舞いを真似るための演算子
* スカラーコンテキストでは入力ソースの次の1行を返す
* リストコンテキストでは入力ソースの行のリストを返す
### 豊富な特殊変数1
* $_(ドル・アンダースコア)
* 数多くの操作のデフォルト引数
* AWKでは$0
* $.(ドル・ドット)
* 現在の入力レコードのレコード番号
* AWKではNR
### 豊富な特殊変数2
* $/(ドル・スラッシュ)
* 入力レコードセパレータ
* AWKではRS
* $\(ドル・バックスラッシュ)
* 出力レコードセパレータ
* AWKではORS
### 豊富な特殊変数3
* $ARGV(ドル・アーグヴィー)
* 現在の入力ソースのファイル名
* STDINでは"-"
* AWKではFILENAME
* ARGV(アーグヴィー)(変数ではない)
* 現在の入力ソースのファイルハンドル
* AWKでは対応するものなし
* @ARGV(アット・アーグヴィー)
* プログラム引数の配列
* AWKではARGV
### 豊富な特殊変数4
* $"(ドル・ダブルクォート)
* ダブルクォートで囲んだ配列の各要素の間に自動的に挿入する文字
* AWKでは対応するものなし
* $,(ドル・コンマ)
* print文の引数の間に出力する文字
* AWKではOFS
### 豊富な特殊変数
* 一旦この辺で中断
* 詳しく知りたい方は、man perlvarコマンドで
### 豊富な起動オプション1
* -e '_code_'(codeの実行)
* _code_をプログラムとしてPerlに実行させる
* -w(警告)
* 警告メッセージを有効にする
### 豊富な起動オプション2
* -n(読み込み)
* $_にレコードを格納する暗黙の読み込みループを要求する
* -p(読み込んで出力)
* $_にレコードを格納してその内容に処理を施してから自動的に出力する
### 豊富な起動オプション3
* -a(フィールド処理)
* -n や -p といっしょに用いると自動的にレコードをフィールドに分割して配列 @F に格納する
* -F’_sep_'(フィールド処理)
* -a のフィールドセパレータを_sep_とする
### 豊富な起動オプション4
* -l(行末処理)
* 入力レコードからの入力セパレータの削除と出力レコードへの出力セパレータの挿入を自動で行う
* -0_digits_(レコードセパレータの設定)
* レコードの末尾を表す文字を8進数で定義
* -0のみでnull文字を指定したことになる
* -00では改行のみの行が区切りとなる
* -0777でファイル全体が1レコードとなる
### 豊富な起動オプション5
* -s(スイッチ処理)
* スイッチ処理を有効にする
### 豊富な起動オプション6
* -M'_modname_'(モジュールロード)
* 指定されたモジュールをロードする
* -C[_number/list_](Unicode機能制御)
* 指定の入出力ストリームの文字コードをUTF-8と仮定する
### 豊富な起動オプション
* まだまだある
* 詳しく知りたい方は、man perlrunコマンドで
### 強力な正規表現(さわりだけ)
* Perlでは正規表現は主に次の2つの演算子で扱う
* マッチ演算子
* 置換演算子
### マッチ演算子
* 文字列 =~ m/パターン/[修飾子]の書式で使用する
* 演算子の対象はデフォルトで$_
* mはデリミタに"/"を使う場合は省略可能
* mを使う場合はデリミタは変更可能
* デリミタにはブラケットペアが使用可能
* マッチに成功すると1、失敗すると空文字列を返す
* パターンにサブマッチを使用する、またはg修飾子を使うとマッチ文字列のリストを返す
### 置換演算子
* 文字列 =~ s/パターン/置換文字列/[修飾子]の書式で使用する
* 演算子の対象はデフォルトで$_
* 置換前の文字列を残したい場合は、他の変数を使用する
* デリミタは変更可能
* デリミタにはブラケットペアが使用可能
### 続きは次回で
#### ご静聴ありがとうございました