すぐわかるPerlでPerlを学ぶ(その5)
![すぐわかるPerl (Software Technology) すぐわかるPerl (Software Technology)](https://images-fe.ssl-images-amazon.com/images/I/41LnrObXh5L._SL160_.jpg)
すぐわかるPerl (Software Technology)
- 作者: 深沢千尋
- 出版社/メーカー: 技術評論社
- 発売日: 1999/07/01
- メディア: 単行本
- 購入: 11人 クリック: 300回
- この商品を含むブログ (44件) を見る
第6章
標準入力を受け取る
標準入力を受け取るために
#!/usr/bin/perl while(<STDIN>) { print ; }
これを使ってみます。
itotto@www > ./stdintest1.pl hogehoge <------ キーボードから入力 hogehoge <------ print文のecho出力
これを解決するのが$_という変数です。上記のプログラムを下記のように書き換えてみます。
#!/usr/bin/perl while($_ = <STDIN>) { print $_; }
$_という変数に標準入力からの入力を代入して表示すると言うロジックになりました。これを実行します。
itotto@www > ./stdintest1.pl hogehoge <------ キーボードから入力 hogehoge <------ print文のecho出力
前回と同じ結果となりました。つまり、
-
- while文の条件で
と書くと自動でその結果が$_に代入されている - print文にも$_が暗黙のうちに渡されている
- while文の条件で
ということが分かります。
正規表現
特定のパターンに一致/不一致するケースを抜き出すためのメタな表現として「正規表現」というものがあり、Perlはこの正規表現が非常に強力にサポートされている言語です。
まずは一致するパターンを試します。
#!/usr/bin/perl while(<STDIN>) { if (/itotto/){ print $_; } else { print 'No match.\n'; } }
最初のif文の条件に入っているとおり、/に囲まれた部分が正規表現による記述です。
itottoに一致するデータの場合にはそのまま表示し、一致しなかった場合には"No match."というデータを表示するというロジックになっています。
これを実行してみましょう。
itotto@www > ./stdintest2.pl hogehoge <------ キーボードから入力 No match. <------ print文のecho出力 fugafuga <------ キーボードから入力 No match. <------ print文のecho出力 itotto <------ キーボードから入力 itotto <------ print文のecho出力
上に書いたとおりの動作になっていることが確認出来ます。
このように/の中に一致/不一致パターンを記述することでそのケースのみ処理をすることが可能なのです。代表的な正規表現をまとめました。
-
- 正規表現例
正規表現 | 役割 |
---|---|
[abc] | aかbかcのいずれかに一致 |
[a-z] | aからzまでの任意の小文字アルファベットに一致 |
[^abc] | a,b,c全てに一致しない文字 |
\d | 数値の集合 |
\D | 数値以外の集合(^\dと等価) |
\w | 英数字の集合 |
\W | 英数字以外の集合(^\wと等価) |
\s | 空白文字 |
\S | 空白文字以外(^\sと等価) |
\b | 単語境界文字 |
x* | xの0回以上の繰り返し |
x+ | xの1回以上の繰り返し |
x? | xの0 or 1回の繰り返し |
x{n} | xのn回の繰り返し(xxx....xと等価) |
x{n,} | xのn回以上の繰り返し |
x{n,m} | xのn回以上m回以下の繰り返し |
ho(ge)+ | hoge,hogege,hogegege...に一致 |
hoge|fuga*1 | hogeもしくはfugaに一致 |
^ | 先頭 |
$行末 |
-
- iスイッチ
/pattern/i と表記すると大文字小文字を無視して一致を検出します。
-
- 区切り文字を変更する
/を区切り文字にする場合などは以下のように記述できます
m|pattern|
mの後に続く文字が区切り字文字となります。
これらを駆使して文字パターンを検出して編集します。
*1:ここでは全角にしていますが|は半角です