CGI::Application::Dispatchで下記のようなURLを実装する方法。

http://yourdomain.com/app.cgi/[param1]/[param2]

(mod_rewriteは使わない)

app.cgi

#!/usr/bin/perl
use strict;
use warnings;
use lib qw (./lib);
use CGI::Carp qw (fatalsToBrowser);
use CGI::Application::Dispatch;

CGI::Application::Dispatch->dispatch(
    prefix  => 'WebApp',
    table   => [
        ''               => { app => 'Index', rm => 'index' },
        ':param1/:parm2' => { app => 'Index', rm => 'hoge' },
    ]
);

lib/WebApp/Index.pm (¥マークほんとは半角)

package WebApp::Index;
use strict;
use warnings;
use lib qw (./lib);
use base qw (WebApp);

sub setup {
    my $self = shift;
    $self->start_mode('index');
    $self->run_mode(
        index => 'do_index',
        hoge  => 'do_hoge',
    );
}

sub do_index {
    return "TopPage";
}

sub do_hoge {
    my $self = shift;
    my $p1 = $self->param('param1');
    my $p2 = $self->param('param2');
    return "¥$p1 is $p1. And ¥$p2 is $p2.";
}

1;

lib/WebApp.pm

package WebApp;
use strict;
use warnings;
use lib qw (./lib);
use base qw (CGI::Application);

sub cgiapp_prerun {
    my $self = shift;
    $self->header_props( -charset => 'utf-8' );
}

1;

こんな感じで動いた。無駄な記述もあるのかもしれんけど、とりあえず動いた。

http://yourdomain.com/app.cgi

で「TopPage」が表示されて

http://yourdomain.com/app.cgi/fuga/dodo

だと「$p1 is fuga. And $p2 is dodo.」が表示される。