## Perl ワンライナー入門
#### 講師:USP友の会 鳥海秀一
### Perlワンライナー入門(全2回)
* 第1回:Perlワンライナー入門
* 第2回:Perl正規表現入門
### 第1回:Perlワンライナー入門
#### ワンライナーを支援するPerlの機能
* 未定義の変数が使用可能
* ダイヤモンド演算子
* 豊富な特殊変数
* 豊富な起動オプション
### 第2回:Perl正規表現入門
#### ワンライナーを支援するPerlの機能
* 強力な正規表現
#### 講師: 鳥海秀一
* Perl歴:0年
* こんな講師でごめんなさい
### 講義の前提
* Perlのワンライナーを記述する基本的な知識がある
* 正規表現を使ったことがある
### 参考書
* プログラミングPerl(オライリー・ジャパン)
* 詳説 正規表現(オライリー・ジャパン)
* はじめてのJavaScript(オライリー・ジャパン)
* 正規表現辞典(翔泳社)
* ミニマルPerl(オライリー・ジャパン)
### 正規表現とは
* 正規表現は集合の全要素を列挙することなしに文字列の集合を記述する方法
* 多くのコマンドやプログラミング言語が正規表現を取り入れているが細部は異なる
* POSIXでは基本正規表現(BRE)と拡張正規表現(ERE)を定めている
### Perlの正規表現の特徴
* 拡張正規表現を上回る豊富な表現力をもつ
* もともと正規表現は正規文法というクラスに属する文法を記述する手段
* Perlの正規表現は正規文法のクラスに収まらない文法も記述可能
### 正規表現を使用するPerlの機能
* マッチ演算子
* 置換演算子
* split関数
* qr演算子
### マッチ演算子
* 書式
* 文字列被演算子 =~ m/正規表現被演算子/修飾子(マッチする)
* 文字列被演算子 !~ m/正規表現被演算子/修飾子(マッチする)
* =~を使わない場合は文字列被演算子として$_が使われる
* デリミタは英数字でも空白文字でもない文字を自由に使用可能
### マッチ演算子のデリミタ
* デリミタが"/"の場合は、mはオプションとなる
* デリミタとしてブラケットペアを使用することができる
* ブラケットペアを使用した場合、入れ子にすることができる
* シングルクォートとクエッションマークは特別な意味をもつ
### シングルクォートを使用した場合
* 変数展開を行わない
* 6種類の変換エスケープを行わない
### 変数展開と変換エスケープ
* Perlが正規表現を解釈する前に実行すること
* 変換エスケープには以下の6種類がある
* /Q - 正規表現のメタ文字をクォート
* /U - 以降の文字を大文字に変換
* /L - 以降の文字を子文字に変換
* /E - /Q,/U,/Lの終端
* /u - 直後の1文字を大文字に変換
* /l - 直後の1文字を子文字に変換
### クエッションを使用した場合
* マッチが成功するとそれ以上マッチしなくなる
* reset関数を実行すると再び1回だけマッチする
### 置換演算子
* 書式
* 文字列被演算子 =~ s/正規表現/置換文字列/修飾子
* 文字列被演算子は左辺値のみを使用可能
* =~を使わない場合は文字列被演算子として$_が使われる
* デリミタは英数字でも空白文字でもない文字を自由に使用可能
* デリミタにブラケットペアを使用した場合、開きデリミタの前に空白文字が置ける
* 置換演算子が返す値は置換に成功した回数
### 正規表現に関する特殊変数
* $` - マッチした部分の前のテキスト
* $' - マッチした部分の後のテキスト
* $& - マッチしたテキスト
* $1 - 1番目の括弧がマッチしたテキスト
* $2 - 2番目の括弧がマッチしたテキスト
* $+ - 最後の括弧がマッチしたテキスト
### パターン修飾子
* 正規表現に作用する修飾子
* マッチ演算子に作用する修飾子
* 置換演算子に作用する演算子
### 正規表現に作用する修飾子
* /i - 大文字と小文字の違いを無視する
* /s - ドットを改行にもマッチさせる
* /m - ^と$を行の先頭と末尾にマッチさせる
* /x - パターン内に空白文字とコメントを許す
* /o - パターンを1回だけコンパイルする
### マッチ演算子に作用する修飾子
* /g - グローバルに全てのマッチを見つける
* /gc - 失敗したマッチの後で継続してサーチする
### マッチ演算子に影響を与えるもの
* コンテキスト
* キャプチャ付き括弧
* /g 修飾子
### /g なしの マッチ演算子の働き
* スカラーコンテキスト+括弧なし
* 真偽値を返す
* リストコンテキスト+括弧なし
* 真偽値を返す
* スカラーコンテキスト+括弧あり
* 真偽値を返す
* リストコンテキスト+括弧あり
* キャプチャのリストを返す
### /g ありの マッチ演算子の働き
* スカラーコンテキスト+括弧なし
* プログレッシブマッチを行う
* リストコンテキスト+括弧なし
* マッチしたテキストのリストを返す
* スカラーコンテキスト+括弧あり
* プログレッシブマッチを行う
* リストコンテキスト+括弧あり
* キャプチャのリストを返す
### プログレッシブマッチ
* 前回マッチした場所の次の位置からマッチを開始すること
### プログレッシブマッチ関連機能
* \G
* マッチした場所の次の位置にアンカーを置くメタ文字
* /c修飾子
* 失敗したマッチが開始位置をリセットするのを防ぐ
* pos関数
* マッチの開始位置を取得したりセットしたりする
### 置換演算子に作用する修飾子
* /g - グローバルに置き換える
* /e - 置き換え文字列を式として評価する
### Perlの正規表現
* 文字エイリアス
* 文字クラス
* アンカー
* 量指定子(最短マッチ)
* キャプチャとクラスタ化
* ルックアラウンドアサーション
### 文字エイリアス
* 入力や表示するのが困難な文字に対するエイリアス
* Perlが扱う文字エイリアスの例
* \0 - ヌル文字
* \a - アラーム
* \e - エスケープ
* \f - フォームフィード
* \n - 改行文字
* \r - 復帰文字
* \t - タブ
* \NNN - 指定した8進コードの文字
* \xHEX - 指定した16進コードの文字
### 文字クラス
* ある特定の属性をもつ、または持たない任意の文字にマッチするメタ文字
* Perlが扱う文字クラス
* クラシックな文字クラス
* Unicode属性
* POSIXスタイルの文字クラス
### クラシックなPerl文字クラス
* \d - 数字 [0-9]
* \D - 数字以外 [^0-9]
* \s - 空白文字 [ \t\n\r\f]
* \S - 空白文字以外 [^ \t\n\r\f]
* \w - 単語文字 [a-zA-Z0-9_]
* \W - 単語文字以外 [^a-zA-Z0-9_]
### Unicode属性
* \p{PROP}、およびその否定形の\P{PROP}によって指定する文字クラス
* Unicode属性は\p{IsPROP}という形をとる
* Unicodeブロック属性は\p{InSCRIPT}という形をとる
* Unicode属性は自分で定義することができる
### Unicode属性の例
* IsL - 文字とみなされるもの
* IsM - 他の規定文字に付随して使われる文字
* IsZ - セパレータ(スペースなど)
* IsS - シンボル(特殊記号や符号)
* IsN - 数字
* IsP - 句読点や括弧、クォート
* IsC - コントロールコード類
### Unicodeブロック属性の例
* InHan - 漢字
* InKatakana - カタカナ
* InHiragana - ひらがな
* InLatin - ローマ字
### アンカー
* \A - 文字列の先頭
* \z - 文字列の末尾
* \Z - 文字列の末尾(末尾に改行があればその直前)
* \G - 前回のマッチの末尾
* \b - 単語境界
* \B - 単語境界以外
### 量指定子(最短マッチ)
* {MIN,MAX}? - MIN回以上、MAX回以下マッチする
* {MIN,}? - 少なくともMIN回マッチする
* {COUNT}? - きっかりCOUNT回マッチする
* *? - 0回以上マッチする
* +? - 1回以上マッチする
* ?? - 0回、または1回マッチする
### キャプチャ化とクラスタ化
* (PATTERN) - キャプチャ付きクラスタ化
* (?:PATTERN) - キャプチャなしクラスタ化
* (?修飾子:PATTEN) - クロイスタ
* 修飾子の効果を括弧内に閉じ込める
* 修飾子の前に-(マイナス)を付けると効果を括弧内だけ無効にする
### ルックアラウンドアサーション
* 先読みアサーション
* 後読みアサーション
### 先読みアサーション
* 書式
* (?=PATTERN) - 肯定の先読み
* (?!PATTERN) - 否定の先読み
* PATTENの直前に0幅マッチする
* 任意のPATTENを指定可能
### 後読みアサーション
* 書式
* (?<=PATTERN) - 肯定の後読み
* (?<\!PATTEN) - 否定の後読み
* PATTENの直後に0幅マッチする
* 固定幅のPATTENしか指定できない
### 先後読みアサーションの例
* 数値にカンマを挿入する
* s/(?<=\d)(?=(\d{3})+$)/,/g
* 半角の大文字、数字、および小文字がそれぞれ少なくとも1文字含まれていなければならず、半角の英数字以外は含まれてはならないパスワードのチェック
* /(?=.\*[A-Z])(?=.\*[0-9])(?=.*[a-z])^[a-zA-Z0-9]+$/
### qr//クォート正規表現演算子
* 正規表現をコンパイルして、その結果を返す演算子
* 普通の正規表現と同じように変数展開も行う
* 普通の正規表現と同じように修飾子もつけられる
* コンパイル結果はあたかも単純な文字列であるかのように扱える
### 解説しきれなかった機能
* split関数
* 非バックトラックサブパターン
* プログラムパターン
* その他いろいろ