2010-10-12 64 views
3

如何計算Perl中字符串開始處的空格量?如何計算Perl中字符串開頭處的空格量?

我現在有:

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

但是,這給了我所有的空格的數量。

+2

由於'tr'不會對正則表達式進行操作NTS量時,''^只是文字字符,而不是一個錨定件。 – toolic 2010-10-12 16:33:01

+0

感謝這個增加 – edelwater 2010-10-12 16:42:33

回答

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

如果你只是想實際空間(而不是空格),那麼這將是:

$str =~ /^(*)/; 

編輯:爲什麼tr不工作是它不是一個正則表達式操作符的原因。 $count = ($temp =~ tr/^ //);正在用$count = ($temp =~ tr/^ //);替代^的所有實例(請參閱下面的評論cjm),然後計算您完成的替換次數。 tr沒有看到^爲「嘿,這是字符串僞字符的開始」它認爲它是「嘿,這是一個^」。

+0

謝謝,這個作品完美! – edelwater 2010-10-12 16:40:04

+0

除非使用'/ d'修飾符,否則'tr'不會刪除字符。原始代碼實際上是用'^'和空格替換'^'和空格(如果REPLACEMENTLIST爲空,則複製SEARCHLIST(http://perldoc.perl.org/perlop.html#tr%2fSEARCHLIST%2fREPLACEMENTLIST%2fcds )。) – cjm 2010-10-12 17:04:11

+0

啊,是的,謝謝你的更正。我編輯了我的帖子以反映真實情況。 – CanSpice 2010-10-12 17:07:15

1

下面是一個腳本,它爲stdin的每一行執行此操作。相關的代碼片段是循環體中的第一個。

#!/usr/bin/perl 

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

oops。看起來像併發類似的答案。 – 2010-10-12 16:33:36

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"; 
+1

這將對原始字符串具有破壞性,因此如果您想稍後檢索原始值,請確保將其分配給單獨的變量! – 2010-10-12 20:39:03

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"; 
} 
+0

+1。這很好。 – codaddict 2010-10-12 16:42:02

1

由於正則表達式匹配返回一個列表上下文中調用時parenthesed比賽,CanSpice的答案可以寫在一個單獨的語句:

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

這PRI的白色空間

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

不需要替換,只需匹配。 – 2010-12-10 14:33:02

相關問題