Webプログラミングをしてみよう!! このページをアンテナに追加 RSSフィード

2008-06-02

そろそろ

途中で投げ出したり三日坊主はやめにしなきゃな...。

はてスタたくさんもらったのでそのうれしさを糧に続きを書くことにします。

すぐわかるPerlでPerlを学ぶ(その5)

すぐわかるPerl (Software Technology)

すぐわかるPerl (Software Technology)


第6章

標準入力を受け取る<STDIN>

標準入力を受け取るために<STDIN>を使用します。


#!/usr/bin/perl

while(<STDIN>) {
   print ;
}

これを使ってみます。


itotto@www > ./stdintest1.pl
hogehoge     <------ キーボードから入力
hogehoge     <------ print文のecho出力

<STDIN>を呼ぶことで標準入力からデータを受け取るのは分かるのですが、不思議なのはprint文に引数として何も渡していないのに標準入力から入力されたデータが与えられているかのように動作している点です。そもそも標準入力からの受け取りがどこにいったのかもまったく不明です。


これを解決するのが$_という変数です。上記のプログラムを下記のように書き換えてみます。


#!/usr/bin/perl

while($_ = <STDIN>) {
   print $_;
}

$_という変数標準入力からの入力を代入して表示すると言うロジックになりました。これを実行します。


itotto@www > ./stdintest1.pl
hogehoge     <------ キーボードから入力
hogehoge     <------ print文のecho出力

前回と同じ結果となりました。つまり、


    • while文の条件で<STDIN>と書くと自動でその結果が$_に代入されている
    • print文にも$_が暗黙のうちに渡されている

ということが分かります。


正規表現

特定のパターンに一致/不一致するケースを抜き出すためのメタな表現として「正規表現」というものがあり、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*1hogeもしくはfugaに一致
^先頭

|$行末|


/pattern/i と表記すると大文字小文字を無視して一致を検出します。


    • 区切り文字を変更する

/を区切り文字にする場合などは以下のように記述できます


m|pattern|


mの後に続く文字が区切り字文字となります。


これらを駆使して文字パターンを検出して編集します。

*1:ここでは全角にしていますが|は半角です