如何计算Perl中字符串开头的空格量?

时间:2010-10-12 16:22:54

标签: regex perl

如何计算Perl中字符串开头的空格量?

我现在有:

  $temp = rtrim($line[0]);
  $count = ($temp =~ tr/^ //);

但这给了我所有空间的数量。

6 个答案:

答案 0 :(得分:11)

$str =~ /^(\s*)/;
my $count = length( $1 );

如果你只想要实际的空格(而不是空格),那就是:

$str =~ /^( *)/;

编辑tr不起作用的原因是它不是正则表达式运算符。您使用$count = ( $temp =~ tr/^ // );正在做的事情是将^的所有实例替换为自身(请参阅下面的cjm评论),然后计算您已完成的替换次数。 tr未将^视为“嘿,这是字符串伪字符的开头”,它将其视为“嘿,这是^”。

答案 1 :(得分:4)

您可以使用@-获取匹配的偏移量。如果搜索非空白字符,这将是字符串开头的空白字符数:

#!/usr/bin/perl

use strict;
use warnings;

for my $s ("foo bar", " foo bar", "  foo bar", "  ") {
        my $count = $s =~ /\S/ ? $-[0] : length $s;
        print "'$s' has $count whitespace characters at its start\n";
}

或者,更好的是,使用@+查找空白的结尾:

#!/usr/bin/perl

use strict;
use warnings;

for my $s ("foo bar", " foo bar", "  foo bar", "  ") {
    $s =~ /^\s*/;
    print "$+[0] '$s'\n";
}

答案 2 :(得分:1)

这是一个为stdin的每一行执行此操作的脚本。相关的代码片段是循环体中的第一个。

  #!/usr/bin/perl

  while ($x = <>) {
    $s = length(($x =~ m/^( +)/)[0]);
    print $s, ":", $x, "\n";
  }

答案 3 :(得分:1)

tr///不是正则表达式运算符。但是,您可以使用s///

use strict; use warnings;

my $t = (my $s = " \t\n  sdklsdjfkl");
my $n = 0;

++$n while $s =~ s{^\s}{};
print "$n \\s characters were removed from \$s\n";

$n = ( $t =~ s{^(\s*)}{} ) && length $1;
print "$n \\s characters were removed from \$t\n";

答案 4 :(得分:1)

由于regexp matcher在列表上下文中调用时返回括号匹配,CanSpice的答案可以写在一个语句中:

$count = length( ($line[0] =~ /^( *)/)[0] );

答案 5 :(得分:1)

这会打印空白量

echo "   hello" |perl -lane 's/^(\s+)(.*)+$/length($1)/e; print'

3