2014-06-11 39 views
1

我是Perl的新手,我將不勝感激。我有2個變量:$release$env_type。我想檢查一個字符串是否包含$release_$env_type,然後做一些事情。例如,在Perl中與正則表達式匹配的問題

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

代碼片段:

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

如果這種狀況不得到解決。請讓我知道什麼是正確的語法來做這個檢查?我在谷歌搜索,但沒有得到任何好帖子。

請幫助!

我有內容的文件:

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

那麼,爲什麼之前'if'條件不打印'$ _'? –

+0

看起來應該起作用。現在的問題是:$ _'中包含了什麼,它是否包含「beta_testing」? '嚴格使用;使用警告;'可能會告訴你'$ _'是否未定義。 – Axeman

+0

除非您的變量包含正則表達式元字符,否則使用'\ Q $ {release} _ $ {env_type} \ E'或'quotemeta'轉義變量可能更安全。 – TLP

回答

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; 
1

如果您正在使用$_,那麼這將正常工作。

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

m//的匹配操作符自動綁定到$_。沒有必要明確地綁定它。

+1

有或沒​​有'm /'這幾乎是一樣的東西 –

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尾隨換行符。

+0

我已經在問題本身中添加了我的文件和我的代碼的內容..它不工作..只是幫助什麼是問題 – Sammi

+0

沒有問題,它也適用於新代碼。 – ikegami