Perlは正規表現の操作に最も強力な言語の一つです。比較には演算子 =~ と !~ を使用します。
正規表現の修飾子:
i — 大文字と小文字を区別しないg — グローバル検索(すべての出現を対象)m — 複数行モード(^ と $ が各行に対して機能する)s — ピリオド(.)が改行文字を含む例:
my $text = "My email: max@mail.com and ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Email: $1 "; }
この例では、ループが文字列からすべてのメールアドレスを抽出します。
一致後は、値が特別な変数 $1, $2, ... (各キャプチャグループごとに)に格納されます。
正規表現による検索が失敗した場合、変数 $1 には何が格納されますか?
答え:
$1は成功した一致の後のみ更新され、失敗した場合は最後の成功した一致の値を保持します。これは潜在的なエラーの原因です!複雑な条件では、明示的に$1,$2, ... をクリアすることが望ましいです。
ストーリー
複雑な正規表現で入力データの検証を行っていましたが、
$1の値に依存していました。適切な文字列が見つからず、一致の後に$1は変わらず、処理は古い間違ったメールアドレスに進みました。
ストーリー
プログラマーが修飾子を誤って指定しました。大きなテキストで
/abc/gを使用し、複数行モードが必要だと考えていました。その結果、パターンは改行を含む必要な行を見つけられず、/abc/msを使用する必要がありました。
ストーリー
プロジェクトでは、すべての出現を検索する際にグローバルフラグ
/gを使用し忘れました。その結果、スクリプトは最初の一致のみを抽出し、ユーザーは完全なデータ一覧を期待していました。