在Perl Catalyst URL中用连字符替换下划线

Ovi*_*vid 5 perl catalyst

我们正在寻找将CamelCase转换为camel-case和下划线为连字符的选项,并希望有人可以提供一些强有力的例子.(出于SEO原因使用连字符).

特别:

在Catalyst中使用MMORPG并厌倦了写这样的事情:

sub travel_to  ( $self, $c, $star ) : Path('travel-to') Args(1)  { ... }
Run Code Online (Sandbox Code Playgroud)

或这个:

package Veure::Controller::Area::StorageLocker {
    ....
    sub index ( $self, $c ) : Path('/area/storage-locker') { ... }
}
Run Code Online (Sandbox Code Playgroud)

更新:因为有一些混乱,我的意思是我们更愿意让开发者写这个:

# getting rid of Args() would be nice, but sigs don't have introspection
sub travel_to  ( $self, $c, $star ) : Args(1)  { ... }
Run Code Online (Sandbox Code Playgroud)

或这个:

package Veure::Controller::Area::StorageLocker {
    ....
    sub index ( $self, $c ) { ... }
}
Run Code Online (Sandbox Code Playgroud)

这很重要,因为对于SEO的立场,下划线而不是连字符可以显着提高您的SEO.由于不得不做额外的粗暴工作以始终强制连字符,开发人员忘记这样做,我们不断浪费钱回去,不得不重写代码,忘记这个警告.这是我们应该能够自动完成的事情.

Bor*_*din 2

CPAN 有一个String::CamelCase模块,它提供了一个decamelize函数,之后您需要使用以下命令将下划线转换为连字符tr/_/-/

我希望这个简短的例子有助于回答您的问题

use strict;
use warnings 'all';
use v.14.1;

use String::CamelCase 'decamelize';

for my $s ( 'travel_to', 'Veure::Controller::Area::StorageLocker' ) {
    (my $ss = $s) =~ s|^[\w:]*::Controller(?=::)||;
    $ss =~ s|::|/|g;
    $ss = decamelize($ss) =~ tr/_/-/r;
    say $ss;
}
Run Code Online (Sandbox Code Playgroud)

输出

travel-to
/area/storage-locker
Run Code Online (Sandbox Code Playgroud)