2011-08-29 87 views
-1

为什么这项工作:Perl正则表达式替换?

$my_str=~s/://g; 

但这并不:

$my_str=~s/:://g; 

我有一个字符串,它看起来是这样的:::this:is:my:string,我需要删除::,但不触及:

+2

当你尝试时会发生什么? –

+0

你一个接一个地在做什么? – Arunmu

+3

它适合我。至少它看起来像*“this:is:my:string”的字符串。我不知道它会用一个看起来像“类似”的字符串来做什么。如果你想真正的答案,显示真实的代码。 –

回答

12

正常工作对我来说:

$ echo "::this:is:my:string" | perl -ne "s/:://g; print;" 
this:is:my:string 
4

你确定你没有在你的代码拼写错误?而这种替代实际上是问题所在?下面的程序为我工作:

my $var = '::a:b:c::'; 
print "$var\n"; 
$var =~ s/:://g; 
print "$var\n"; 

输出:

  1. 打印变量之前,取代后:

    $ perl test.pl 
    ::a:b:c:: 
    a:b:c 
    $ 
    

    编辑,添加一些建议。

  2. 没有马上出现问题,但如果您只需要在字符串的开头删除::,则可能需要在正则表达式中添加^来指示该问题。
3

有两件事我能想到的,会导致$my_str =~ s/:://g;失败:

  1. $my_str不包含你说什么它包含。
  2. pos($my_str)已设定。

为了确保$my_str包含你所想象的那样,你可以使用Data::Dumper,但要确保使用Dumper前做$Data::Dumper::Useqq = 1;

但首先,确保你不会做这样的事情

if ($my_str =~ /.../g) { 
    ... 
    $my_str =~ s/:://g; 
    ... 
} 

if ($my_str =~ /.../g)是一个常见的错误,它可能会导致这个问题。 (我不知道为什么,因为它在概念上甚至没有意义。)如果是这样,在if条件中摆脱g