Perl grep into hash with arrays as values

时间:2015-02-02 21:59:21

标签: arrays perl

我正在构建一个包含以下路径的小型Web服务

my %routes = (
  'News' => ['^news', '^news\/?(.*)?', '^news\/(\d+)\/(edit|delete|update)'],
  'User' => ['^users', '^users\/?(.*)?', '^users\/(\d+)\/(edit|delete|update)'],
);

%routes中的每个键都是一个模块,相应的数组保存模块支持的可能请求。

因此,如果请求是" news / 3 / edit"应该找到并返回新闻模块。

我想做的是,如果相应的数组值与传入的请求匹配,则使用正确的密钥。

1 个答案:

答案 0 :(得分:1)

您应该使用一个允许您创建路由的框架,从长远来看,它将更加简单。在回答你的一般问题时,你可以这样做:

use strict;
use warnings; 

use List::Util qw(any);

my %routes = (
  'News' => ['^news', '^news\/?(.*)?', '^news\/(\d+)\/(edit|delete|update)'],
  'User' => ['^users', '^users\/?(.*)?', '^users\/(\d+)\/(edit|delete|update)'],
);

sub match { 
   my ($string_to_match) = @_;

   foreach my $module ( keys %routes ) {
      return $module if any { $string_to_match =~ m/$_/ } @{$routes{$module}}
   }

   return;
}

然后你可以这样说:

use strict; 
use warnings; 

use feature qw(say);
use MatchRoutes; # or whatever your package is called

say MatchRoutes->new->match('news/3/edit');