Как мне повторить символ n раз в строке? - PullRequest
22 голосов
/ 22 марта 2009

Я изучаю Perl, поэтому, пожалуйста, потерпите меня на этот вопрос.

Как мне повторить символ n раз в строке?

Я хочу сделать что-то вроде ниже:

$numOfChar = 10;

s/^\s*(.*)/' ' x $numOfChar$1/;

Ответы [ 3 ]

25 голосов
/ 22 марта 2009

По умолчанию подстановки принимают строку как заменяемую часть. Для выполнения кода в процессе подстановки вы должны использовать флаг e.

$numOfChar = 10;

s/^(.*)/' ' x $numOfChar . $1/e;

Это добавит $numOfChar пробел к началу вашего текста. Чтобы сделать это для каждой строки в тексте, используйте флаг -p (для быстрой обработки в одну строку):

cat foo.txt | perl -p -e "$n = 10; s/^(.*)/' ' x $n . $1/e/" > bar.txt

или, если он является частью более крупного скрипта, используйте флаги -g и -m (-g для глобального, то есть повторного замещения и -m для совпадения ^ в начале каждой строки):

$n = 10;
$text =~ s/^(.*)/' ' x $n . $1/mge;
15 голосов
/ 22 марта 2009

Ваше регулярное выражение может быть записано как:

$numOfChar = 10;

s/^(.*)/(' ' x $numOfChar).$1/e;

но - вы можете сделать это с:

s/^/' ' x $numOfChar/e;

Или вообще без использования регулярных выражений:

$_ = ( ' ' x $numOfChar ) . $_;
8 голосов
/ 22 марта 2009

Ты прав. Оператор Perl x повторяет строку несколько раз.

print "test\n" x 10; # prints 10 lines of "test"

РЕДАКТИРОВАТЬ: Чтобы сделать это внутри регулярного выражения, вероятно, было бы лучше (a.k.a. наиболее дружелюбный к сопровождающему) просто присвоить значение другой переменной.

my $spaces = " " x 10;
s/^\s*(.*)/$spaces$1/;

Есть способы сделать это без дополнительной переменной, но это всего лишь мои 0,02 доллара, что будет проще поддерживать, если вы сделаете это таким образом.

РЕДАКТИРОВАТЬ: я исправил свое регулярное выражение. Извините, я не прочитал это правильно в первый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...