如何计算Perl中字符串开头的空格量?
我现在有:
$temp = rtrim($line[0]);
$count = ($temp =~ tr/^ //);
但这给了我所有空间的数量。
答案 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