somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【perl】複数行を単一行としてみる

perl正規表現の検索対象となる文字列が複数行の場合に、単一行として見てマッチングさせる方法についてのメモです。

サンプル

色々あさって作ってみました。

use strict;
use warnings;

my $target = <<'END_OF_TARGET';
abc
def
ghi
END_OF_TARGET

if ($target !~ /a.*i/) {
    print "マッチしない\n"
}

# sオプション:「.」が改行に一致するようになる
if ($target =~ /a.*i/s) {
    print "マッチする\n"
}

perl練習もかねて、1行目からまとめていきます。

use

use strict;は、厳密なチェックを行い、正しくない記述をしているものをエラーとして実行できないようになるため、安全なアプリケーション開発を助けます。

use warnings;は、初期化されていない変数を誤って使用してしまう間違いの対策です。警告が出るようになります。

変数宣言

myは、レキシカルスコープ宣言といいます。宣言したスコープ内でしか使えないようになります。

他には、localがあります。ローカル変数ではなく、グローバル宣言です。既に宣言されている変数の値を宣言したスコープ内でのみ変更します。ある関数内で変更して、その関数で別の関数を呼び底で使っている場合、まだ変更されている状態なので挙動が異なります。

ourは、グローバル宣言です。その名のとおり、どこでも使えます。

ヒアドキュメント

宣言した変数の内容は、ヒアドキュメントを利用して改行を含むようにしています。シングルクォートで終端文字を囲んだ場合、文字列内に含まれる変数は展開されません。ダブルクォート、またはクォートで囲まないの場合、展開されます。

文字列演算

!~は、対象の文字列に正規表現のパターンが含まれないときに真になります。

!=は、対象の文字列に正規表現のパターンが含まれるときに真になります。

sオプション

ようやく、本題です。コメントにあるとおり、「.」が改行に一致するようになります。つまり、冒頭に述べたように単一行としてみることができるようになります。

参考