2016-03-08 129 views
-4
foreach $suitename (@suitename) 
    { 
     foreach $fileLines (@fileLines) 
     { 
      if (index($fileLines, $suitename) != -1) 
      { 
        $str = $fileLines; 
        $find = "msg=\"/a-z/\""; 
        $replace = "msg=\"f\""; 
        $find = quotemeta $find; 
        $str =~ s/$find/$replace/g; 
        print $str; 
      } 
     } 
    } 

嗨,我想用$ replace替换所有$ find,msg =“random stuff”,但我没有设法这样做。我所做的就是让我所有的味精=“随机的东西”这里@msgperl搜索并替换随机文本

for ($i = 0; $i < scalar(@fileLines); $i++){ 
     if ($fileLines[$i] =~ /(msg=".*") /) 
     { 
     push (@msg,"$1\n"); 

     } 
} 

请指点。 非常感谢

+0

第一个代码段不会修改'@ fileLines'。我认为你期待它这样做。如果你希望发生这种情况,你需要在'$ fileLines'上执行替换,而不是在$ str上执行替换。 – DavidO

回答

0

通过使用quotemeta,您直接解释了$find。但是删除它还不够,因为您使用的值不准确:要匹配字母a-z,可以改为使用字符类。为了避免backslashing双引号,使用单引号:

$find = 'msg="[a-z]"'; 
$replace = 'msg="f"'; 

如果你想要一个以上的字符,添加+(“至少一次”):

$find = 'msg="[a-z]+"'; 

,而不是字符串,就可以使用qr运算符创建已编译的正则表达式:

$find = qr/msg="[a-z]+"/;