我是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, $_ );
}
}
答案 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;