(与上一个问题相关:
Do I need to reset a Perl hash index?)
我有一个来自文件的哈希,其定义如下:
@H_502_13@%project_keys = ( cd => "continuous_delivery",cm => "customer_management",dem => "demand",dis => "dis",do => "devops",sel => "selection",SEO => "SEO" );我需要检查评论标题是否具有正确的格式,如果是,请链接到单独的URL.
@H_502_13@"cm1234 - Do some CM work"然后我想链接到以下URL:
@H_502_13@http://projects/customer_management/setter/1234目前,我正在使用以下(硬编码)正则表达式:
@H_502_13@if ($title =~ /(cd|cm|dem|dis|do|sel|SEO)(\d+)\s.*/) { my $url = 'http://projects/'.$project_keys{$1}.'/setter/'.$2 }但显然我想从散列键本身构建正则表达式(上面的散列示例会相当频繁地更改).我想过简单地按键连接键如下:
@H_502_13@# Build the regex my $regex = ''; foreach my $key ( keys %project_keys ) { $regex += $key + '|'; } $regex = substr($regex,-1); # Chop off the last pipe $regex = '('.$regex.')(\d+)\s.*'; if ($title =~ /$regex/) { my $url = 'http://projects/'.$project_keys{$1}.'/setter/'.$2 }但是a)它没有按照我的意愿工作,并且b)我认为有更好的Perl方法来做到这一点.还是有吗?
解决方法
您的主要问题来自尝试使用连接字符串.在Perl中没有这样做,字符串连接运算符是..但是,通过连接,通常可以更好地完成具有字符串连接的循环.
我会建议:
@H_502_13@my $project_match = join '|',map quoteMeta,keys %project_keys; if ($title =~ /($project_match)(\d+)\s/) { my $url = 'http://projects/'.$project_keys{$1}.'/setter/'.$2; # Something with $url }quoteMeta是一个函数,它可以转义字符串中出现的任何正则表达式元字符.在您的示例中没有任何内容,但最好始终使用它并避免意外错误.
我在你的模式中遗漏了尾随.*因为如果你实际上没有对这些东西做任何事情,就没有必要说“然后有些东西,或者说没有东西”.除非将其锚定到字符串的开头和结尾,否则模式不需要匹配整个字符串.