我試圖匹配來自Perl程序中某個文件的某些數據模式。由於比賽可能在多條線上,因此我將線分隔符定義爲未定義。Perl正則表達式意外地似乎在修改源字符串
$/ = undef ;
現在,由於匹配可以跨越多行並且多於一行,因此我使用smgi修飾符。
if ($msgText =~ /$msgTypeExpr/smgi)
現在,我遇到的問題是上面的變量$ msgText被修改,雖然我沒有取代它。
下面是相關代碼:
open (HANDLE1,"$file") || die "cannot open file \n";
$/ = undef ;
while (my $msgText = <HANDLE1>)
{
my $msgTypeExpr = "<city\\W+";
print "Attempt 1:\n";
if ($msgText =~ /$msgTypeExpr/smgi)
{
print "matched\n";
}
else
{
print " not matched \n";
}
print "Attempt 2:\n";
if ($msgText =~ /$msgTypeExpr/smgi)
{
print "matched\n";
}
else
{
print " not matched \n";
}
}
測試輸入文件看起來是這樣的:
<city
name="abc">
</city>
人們期望匹配模式的兩倍,但它只是不匹配的第一次第二次。
我已經臨時解決了這個問題,現在在匹配和使用該臨時變量進行匹配之前先指定一個臨時變量。
my $tmpMsgText = $msgText ;
這是我第一次在這個論壇上發帖提問,所以請原諒所有禮儀我可能犯了錯,也請善待足以指出來,這樣我就不會在重複未來。
如果文件是一個XML文件,你應該用XML解析器解析它,而不要試圖用正則表達式來完成。 –
raina77ow - 他正在執行2倍的同樣的事情,所以我相信他希望在兩個時代都匹配<城市。但是由於/ g開關,他的代碼中沒有發生 – Davs