ProgrammingPerl 開発者

Perlの正規表現の特徴を挙げてください。存在する修飾子は何ですか、結果の処理はどのように行いますか?正規表現を使って文字列を解析する例を示してください。

Hintsage AIアシスタントで面接を突破

回答

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 を使用し忘れました。その結果、スクリプトは最初の一致のみを抽出し、ユーザーは完全なデータ一覧を期待していました。