Catalystで何故か特殊変数$1と$2が最初から使われている

正規表現で処理してたら気がついた。何故かCatalystアプリの中では、何もせずともマッチ変数の$1と$2に値が入っている。

必要な部分だけ抜粋

use Data::Dumper;
sub p {warn Dumper shift}
sub auto :Private {
    my ( $self, $c ) = @_;
    p $1;
    p $&;
    p $`;
    p $';
    p $+;
    p '----------------';
    p $2;
    p $3;
    p $4;
    p $5;
}

結果

$VAR1 = 'NEXT';
$VAR1 = 'NEXT::config';
$VAR1 = '';
$VAR1 = '';
$VAR1 = 'config';
$VAR1 = '----------------';
$VAR1 = 'config';
$VAR1 = undef;
$VAR1 = undef;
$VAR1 = undef;


ちょっと戸惑った。

中途半端に探ってみる

どーせNEXT.pmだろうなと思ったんだけど

% cd /usr/lib/perl5/site_perl/
% find . -name "*pm" | xargs grep 'NEXT::config'

./5.8.5/Catalyst.pm:    $c->NEXT::config(@_);

該当個所

sub config {
    my $c = shift;

    $c->log->warn("Setting config after setup has been run is not a good idea.")
      if ( @_ and $c->setup_finished );

    $c->NEXT::config(@_);
}

力尽きました。
そもそも、正規表現でマッチが成功したら処理するって書き方してれば遭遇しない罠。

ヒント発見。http://d.hatena.ne.jp/holidays-l/20060902

というわけで

vi Catalyst/Dispatcher.pm

our @PRELOAD = qw/Index Path/;


変わらずorz