如何計算Perl中字符串開始處的空格量?如何計算Perl中字符串開頭處的空格量?
我現在有:
$temp = rtrim($line[0]);
$count = ($temp =~ tr/^ //);
但是,這給了我所有的空格的數量。
如何計算Perl中字符串開始處的空格量?如何計算Perl中字符串開頭處的空格量?
我現在有:
$temp = rtrim($line[0]);
$count = ($temp =~ tr/^ //);
但是,這給了我所有的空格的數量。
$str =~ /^(\s*)/;
my $count = length($1);
如果你只是想實際空間(而不是空格),那麼這將是:
$str =~ /^(*)/;
編輯:爲什麼tr
不工作是它不是一個正則表達式操作符的原因。 $count = ($temp =~ tr/^ //);
正在用$count = ($temp =~ tr/^ //);
替代^
和的所有實例(請參閱下面的評論cjm),然後計算您完成的替換次數。
tr
沒有看到^
爲「嘿,這是字符串僞字符的開始」它認爲它是「嘿,這是一個^
」。
謝謝,這個作品完美! – edelwater 2010-10-12 16:40:04
除非使用'/ d'修飾符,否則'tr'不會刪除字符。原始代碼實際上是用'^'和空格替換'^'和空格(如果REPLACEMENTLIST爲空,則複製SEARCHLIST(http://perldoc.perl.org/perlop.html#tr%2fSEARCHLIST%2fREPLACEMENTLIST%2fcds )。) – cjm 2010-10-12 17:04:11
啊,是的,謝謝你的更正。我編輯了我的帖子以反映真實情況。 – CanSpice 2010-10-12 17:07:15
下面是一個腳本,它爲stdin的每一行執行此操作。相關的代碼片段是循環體中的第一個。
#!/usr/bin/perl
while ($x = <>) {
$s = length(($x =~ m/^(+)/)[0]);
print $s, ":", $x, "\n";
}
oops。看起來像併發類似的答案。 – 2010-10-12 16:33:36
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";
這將對原始字符串具有破壞性,因此如果您想稍後檢索原始值,請確保將其分配給單獨的變量! – 2010-10-12 20:39:03
可以使用@-
匹配獲取偏移。如果你搜索一個非空白字符,這將是空格字符數在字符串的開頭:
#!/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";
}
+1。這很好。 – codaddict 2010-10-12 16:42:02
由於正則表達式匹配返回一個列表上下文中調用時parenthesed比賽,CanSpice的答案可以寫在一個單獨的語句:
$count = length(($line[0] =~ /^(*)/)[0]);
這PRI的白色空間
echo " hello" |perl -lane 's/^(\s+)(.*)+$/length($1)/e; print'
不需要替換,只需匹配。 – 2010-12-10 14:33:02
由於'tr'不會對正則表達式進行操作NTS量時,''^只是文字字符,而不是一個錨定件。 – toolic 2010-10-12 16:33:01
感謝這個增加 – edelwater 2010-10-12 16:42:33