【入門編】HSLのRegexモジュール:PHPのpreg_matchの落とし穴を型安全に回避する – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

やあ。Hackの世界へようこそ。
私はHHVMのコアを長年見守ってきた者だ。君が今、PHPからHackへと足を踏み入れ、HSL(Hack Standard Library)の深淵に触れようとしていること、心から歓迎するよ。

今日は、多くのエンジニアが「なんとなく」使い、そして「地雷」を踏み抜いてきたPHPの正規表現関数(`preg_match`など)を、Hackがいかにしてエレガントに、そして冷徹なまでに型安全に解決しているか、その核心を解説しよう。

—

1. PHPの『優しすぎる罠』

PHPの `preg_match` を使ったことがあるだろうか? あの関数は、動的型付け言語ゆえの「優しさ」を持っている。だが、その優しさは時に君のコードを崩壊させる。

// PHPのコード
$result = preg_match(‘/(\d+)/’, ‘123’, $matches);
// $result は 0, 1, false (エラー時) が返る
// $matches は配列だが、中身がどうなっているかは実行するまで誰にも分からない

君はここで `if ($result)` と書くかもしれない。しかし、もし正規表現のコンパイルエラーが起きたら? もし期待したキャプチャグループが空だったら? PHPは何も教えてくれない。実行時に「Undefined index」という悪夢が君を待っているだけだ。

2. HSLが提示する『型安全という名の盾』

Hackの標準ライブラリ(HSL)にある `HH\Lib\Regex` モジュールは、この不確実性を「型」という壁で完全に排除している。

HSLの正規表現は、結果を「あいまいな戻り値」で返さない。代わりに、「成功したか、失敗したか」を明示的なデータ構造で表現するんだ。

基本的な使い方:`Regex\first_match`

use HH\Lib\Regex;

<<__EntryPoint>>
function main(): void {
$input = ‘id: 12345’;

// first_match は、マッチした場合はその結果(Shape)を返し、
// しなければ null を返す。これだけ。
$match = Regex\first_match($input, ‘/id: (?\d+)/’);

if ($match !== null) {
// ここでは $match[‘id’] は確実に文字列として存在する!
echo “IDは: ” . $match[‘id’];
} else {
echo “マッチしませんでした”;
}
}

なぜこれが「安全」なのか?

1. 戻り値が厳格: `Regex\first_match` のシグネチャは `?Regex\Match` だ。つまり、成功か、あるいは「何もない(null)」かしかあり得ない。PHPのように「0か1かfalseか」を悩む必要はない。
2. 名前付きキャプチャグループ: 正規表現内の `(?\d+)` は、そのまま結果の連想配列のキーになる。型チェッカーは「`id` というキーがその配列に存在する」ことを静的に保証するんだ。

—

3. 陥りやすい「型」の落とし穴

Hackを始めたばかりの人がよく躓くポイントがある。それは「正規表現のコンパイルエラー」だ。

PHPでは実行中にしか分からない正規表現のミスを、Hackではどう扱うか。

// 危険な例: 意図的にエラーを起こすパターン
try {
// 文字列リテラルではない動的なパターンを使う際は要注意
$match = Regex\first_match($input, $user_provided_pattern);
} catch (Regex\InvalidPatternException $e) {
// HSLは不正な正規表現を「エラー値」ではなく「例外」として投げる
// これにより、静的解析が追えない動的なエラーも確実にキャッチできる
echo “正規表現が壊れています: ” . $e->getMessage();
}

ポイント: HSLでは、正規表現リテラルを直接書くことを強く推奨する。そうすれば、HHVMの型チェッカーがコンパイル時に「その正規表現は構文的に正しいか」まで検証してくれるからだ。これが、動的言語には決して到達できない「静的言語の特権」だよ。

—

4. まとめ:なぜHSLを使うのか

PHPから移行してきた君にとって、最初は「型を書くのが面倒だ」と感じるかもしれない。しかし、考えてみてほしい。

  • `preg_match` の戻り値を確認する `if` 文に費やす時間
  • 予期せぬ `null` や「Undefined index」で夜中に呼び出されるアラート
  • 「この変数は結局何が入っているんだ?」とソースコードを遡る徒労

これらすべてが、HSLを使えば 「型チェッカーが教えてくれる」 状態になるんだ。

君へのアドバイス

Hackを掌握するコツは、「型チェッカーと喧嘩するのではなく、型チェッカーを君の最も優秀なデバッガーにする」 ことだ。`Regex` モジュールはその第一歩として最適だよ。

次は `Regex\every_match` で、リスト形式の結果をどう扱うか見ていくといい。ここをクリアすれば、もう君はPHPの不安定な挙動に怯える必要はない。

君の書くコードが、型によって守られ、美しく進化することを期待しているよ。また何かあればいつでも聞いてくれ。

タイトルとURLをコピーしました