Perl中的正则表达式匹配问题

时间:2014-06-11 12:58:32

标签: regex perl

我是Perl的新手,任何帮助都将不胜感激。我有两个变量:$release$env_type。我想检查字符串是否包含$release_$env_type,然后执行某些操作。例如,

$release="beta";
$env_type="testing";
so string is beta_testing

代码段:

if ( $_ =~ /${release}_${env_type}/ ) {
        #do Something
 }

这个条件没有得到解决。请告诉我进行此项检查的正确语法是什么?我在Google上搜索过但没有得到任何好的帖子..

请帮忙!

我有一个包含内容的文件:

admin_vh_c9_simv2_edg=/console,/consolehelp
idminternal_vh_c9_simv2_edg=/oim,/soa-infra
sso_vh_c9_simv2_edg=/oim,/soa-infra,/odsm

my $env_type = "edg";
my $release  = "c9_simv2";
#Input file containing contexts
my $idmInternal = "./IdmContexts.conf";
if ( !-e $idmInternal ) {
    die "Unable to find the file $idmInternal!\n";
}

open( MYFILE, $idmInternal );
while (<MYFILE>) {
    chomp;
    if ( $_ =~ /${release}_${env_type}/ ) {
        push( @filtered, $_ );
    }

}

3 个答案:

答案 0 :(得分:6)

你的代码很好。问题出在其他地方。以下打印match

my $release="beta";
my $env_type="testing";

$_ = "so string is beta_testing";

if ( $_ =~ /${release}_${env_type}/ ) {
   print "match\n";
}

注意:/\Q${release}_${env_type}/会更好。它确保插值变量中的特殊字符与自身匹配。


最有可能的问题:您从文件中读取$release和/或$env_type的值,忘记了chomp尾随换行符。

答案 1 :(得分:1)

如果您使用$_,那么这将有效。

if (m/${release}_${env_type}/)
{
     # Do something
}

m//匹配运算符会自动绑定到$_。没有必要明确地绑定它。

答案 2 :(得分:0)

要真正告诉您发生了什么,您可以在测试之前注入代码。例如,首先编译一个正则表达式然后打印它。

# compile the regex first
my $regex = qr/${release}_${env_type}/;

say qq{\$regex="$regex"};

# then print your scanned text
say qq{\$_="$_"};

if ( m/$regex/ ) { 
    # do something
}

如果您要显式绑定到正则表达式,请使用变量:

my $string = $_;
if ( $string =~ m/$regex/ ) { 
}

否则,只需匹配“上下文变量”($_)。

 if ( m/$regex/ ) { 
 }

另外,USUW会主动帮助发现一些问题:

# Before everything else
use strict;
use warnings;