preg_match のキャプチャ

<?php
$words = explode(' ', 'abc ab ac');
foreach ($words as $word) {
        preg_match('/\A (a) (b)? (c)? \z/x', $word, $match);
        print_r($match);
}
?>
% php test.php
Array
(
    [0] => abc
    [1] => a
    [2] => b
    [3] => c
)
Array
(
    [0] => ab
    [1] => a
    [2] => b
)
Array
(
    [0] => ac
    [1] => a
    [2] =>
    [3] => c
)

最後のキャプチャがない。null なり空文字なりが入るもんだと思っていたけど、こういうもの?

Perl の場合はどうだろう。

use strict;
use warnings;
use Data::Dumper;

my @words = qw(abc ab ac);

for (@words) {
    my @match = /\A (a) (b)? (c)? \z/ox;
    print Dumper(\@match);
}
% perl test.pl
$VAR1 = [
          'a',
          'b',
          'c'
        ];
$VAR1 = [
          'a',
          'b',
          undef
        ];
$VAR1 = [
          'a',
          undef,
          'c'
        ];

こっちは思った通りな感じだ。