Как подсчитать количество пробелов в начале строки в Perl? - PullRequest
4 голосов
/ 12 октября 2010

Как подсчитать количество пробелов в начале строки в Perl?

Теперь у меня есть:

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

Но это дает мне счет всех пробелов.

Ответы [ 6 ]

11 голосов
/ 12 октября 2010
$str =~ /^(\s*)/;
my $count = length( $1 );

Если вы просто хотите использовать реальные пробелы (вместо пробелов), то это будет:

$str =~ /^( *)/;

Редактировать: Причина, по которой tr не работает, заключается в том, что это не оператор регулярного выражения. То, что вы делаете с $count = ( $temp =~ tr/^ // );, заменяет все экземпляры ^ и на себя (см. Комментарий ниже на cjm), а затем подсчитывает, сколько замен вы сделали. tr не видит ^ как "эй, это начало псевдосимвола строки", он видит его как "эй, это ^".

4 голосов
/ 12 октября 2010

Смещение совпадения можно получить с помощью @-. Если вы ищете непробельный символ, это будет количество пробельных символов в начале строки:

#!/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 голос
/ 13 октября 2010

Это печатает количество пробелов

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

3

1 голос
/ 12 октября 2010

Поскольку сопоставитель регулярных выражений возвращает совпадения в скобках при вызове в контексте списка, ответ CanSpice можно записать в одном выражении:

$count = length( ($line[0] =~ /^( *)/)[0] );
1 голос
/ 12 октября 2010

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 голос
/ 12 октября 2010

Вот скрипт, который делает это для каждой строки стандартного ввода. Соответствующий фрагмент кода является первым в теле цикла.

  #!/usr/bin/perl

  while ($x = <>) {
    $s = length(($x =~ m/^( +)/)[0]);
    print $s, ":", $x, "\n";
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...