やあ。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: (?
if ($match !== null) {
// ここでは $match[‘id’] は確実に文字列として存在する!
echo “IDは: ” . $match[‘id’];
} else {
echo “マッチしませんでした”;
}
}
なぜこれが「安全」なのか?
1. 戻り値が厳格: `Regex\first_match` のシグネチャは `?Regex\Match` だ。つまり、成功か、あるいは「何もない(null)」かしかあり得ない。PHPのように「0か1かfalseか」を悩む必要はない。
2. 名前付きキャプチャグループ: 正規表現内の `(?
—
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の不安定な挙動に怯える必要はない。
君の書くコードが、型によって守られ、美しく進化することを期待しているよ。また何かあればいつでも聞いてくれ。