う〜ん、/g はループなのに break する方法が用意されていない。
COMMIT があるのにこれがないのはとても不可解だ。

# 先読みの中の (*SKIP) は機能しない。
@test = $_ =~ m/1|2(?=.*(*SKIP))|3/g;

# while 文の last を使う。
$_ = "123";
while ( m/1|2|3/gp )
{ print "${^MATCH}\n";
last; } # 1 で止まる。

# (?{code}) で last → 効果なし
while ( m/1|2(?{ last; })|3/gp )

# while 文に名前を付けて (?{code}) で last → 効果なし
TEST : while ( m/1|2(?{ last TEST; })|3/gp )

perl陣営に言えば新しいコマンド作ってくれそうだなぁ。