キッズプレート、パスタおかわり

プログラミングやデジモノについてあれこれ
--.--.-- --:--|カテゴリ:スポンサー広告| コメント(-)

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2012.02.02 01:07|カテゴリ:Perlコメント(0)

[Perl][正規表現]小話:$君の動きを再確認してみた話


Oh! lady!
A-1 dollar B-2 dollars 淫ら~♪ No, on onn.....
  ~10$ by SMAP~

 はい、スタートのネタ歌詞を検索する為に「smap」検索しようとして無意識に「cmap」を検索していたひらくんです。そう今日はダラーダラー、正規表現で文末を表す位置指定子 $ 君の動きを再確認したお話。

  先日こんなソースを拝見しました。

$line = "ABCDEFG\n";
$line =~ s/\n$//;
print $line . "TEST\n";
$line = "ABCDEFG\n";
$line =~ s/(\n|.)$//;
print $line . "TEST\n";

 こいつの実行結果はこうなります。

ABCDEFGTEST
ABCDEF
TEST

 最初の正規表現「$line =~ s/\n$//;」は行末の改行文字を削除する処理です。行末を表す$の直前にある改行文字がマッチして改行が削除されています。その置換の結果は実行結果の「ABCDEFGTEST」という文字列をみることで確認できます。まさに前回紹介した chomp 君を彷彿とさせる働きです。

 では次の置換指定はどうでしょう? つぎの指定は先ほどとはちょっと趣が違います。

$line =~ s/(\n|.)$//;

 パターンの選択を行う「|」使用して「行末にある改行もしくは任意の文字を削除」するという指定です。こうすれば仮に文字列の最後が改行でも普通の文字でも一文字削除することになります。そうまさに狙うは、

「chopの実装です」

 チョップチョップ、力道山ばりのチョップをきめちゃおうという指定ですが出力結果をみてみると、

「なんということでしょう」

 置換結果は思惑とは裏腹に「G」を削除しています。しかもこのGは行末から数えて二番目にある文字です。先ほどの指定はどう見ても「行末にある改行もしくは任意の一文字」こいつは不可解です。

 最初このソースと実行結果の相談を受けた際、一瞬私もなぜこういった結果になるかわかりませんでした。

「行末の直前の1文字をパターン選択で選んでいるだけなのに、どうして行末から二番目の文字がマッチしているの??」

 その答えを知るには $ 君の仕様を正確に理解することが必要です。実は、

「$ 君は文末だけを表す位置指定子ではないんです」

 そう、ちがうんですよ奥さん。聞いてちょうだい見てちょうだい、本当は、

「$ は文末もしくは文末にある改行文字の直前にマッチする位置指定子です」

 そっかー、文末にある改行文字の直前にもマッチするのか。だから正規表現の最長最左のルールとあいまって、

「文末にある改行文字の前にある任意の一文字」

 にマッチしたのか。

 さて $ 君の動きが理解できたところで次の一手、

「じゃあ改行も任意の文字も含めて文末にある文字を単純に削除するにはどうするの? 正規表現じゃあ chop の夢は見れないの?」

 という新たなテーマが出現するわけです。それでは登場していただきましょう。あらゆる文末制御を可能にする、

「ミラクルZの登場です!」

 Perlの正規表現では「\Z」と「\z」という二種類の位置指定子が利用可能です。これらは $ 君同様に文末を表す指定子なのですが、次のような特徴があります。

\Z大文字 Z 。文末を表す指定子で$と同様に文末にある改行の直前にもマッチ。$とちがいmオプションに左右されないという一本気な性格を持つ
\z小文字 z 。文末を表す位置指定子。大文字 Z 同様にmオプションに惑わされない。さらに文末に改行があっても必ず文字列の末尾にのみマッチする頑固者


 それではさっそくサンプルコードで違いを確認してみましょう。大文字 Z だと同様の結果になってしまいますので小文字の z を使用してみます。

$line = "ABCDEFG\n";
$line =~ s/\n\z//;
print $line . "TEST\n";
$line = "ABCDEFG\n";
$line =~ s/(\n|.)\z//;
print $line . "TEST\n";


 結果はこうなります。
ABCDEFGTEST
ABCDEFGTEST


 見事どちらも文末の改行がマッチしています。いやーこうやって基本的な事柄を改めて再確認して行くって楽しいですねー。
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

ひらくん Author:ひらくん
どもども、ひらんくんどす。
日々まったり過ごしております。
仕事はDTP関連のスプリクト&アプリケーション開発。
Follow happyscript on Twitter

ブログ内検索



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。