3

[ aa bb cc ]在一行中有一些子字符串,比如$line = "1 2 a b [ aa bb cc ] c d [ bb cc ] 3 4". 我想修剪这些子字符串中的所有空格。以下代码不起作用。

while($line =~ /\[(.*?)\]g/)
{
  $1 =~ s/\s+//g;
}

有人可以帮忙吗

4

3 回答 3

7
s{\[(.*?)\]}{
   my $s = $1;
   $s =~ s/\s+//g;
   $s
}eg;
于 2013-04-23T04:15:15.533 回答
2

与您的尝试类似的另一种方式:

while($line =~ s/\[([^\]\s]*)\s+/[$1/g) {}

而且您不必转义 r 方括号,但它有助于 vim。

于 2013-04-23T05:01:12.997 回答
0

您的方法失败,因为匹配变量$1是只读的。您可以使用非破坏性替换(在 Perl 5.16 中引入)来避免该问题:

use warnings;
use strict;

my $line = "[foo bar] [   baz    ]  sproing";
while($line =~ /\[(.*?)\]/g)
{
    my $result = $1 =~ s/\s+//gr;
    print "|$result|\n";
}
于 2013-04-23T06:41:22.300 回答