web-dev-qa-db-fra.com

Comment répéter un personnage N fois dans une chaîne?

J'apprends Perl, alors veuillez porter avec moi pour cette question noob.

Comment répéter un personnage N fois dans une chaîne?

Je veux faire quelque chose comme ci-dessous:

$numOfChar = 10;

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

Par défaut, les substitutions prennent une chaîne comme la partie à substituer. Pour exécuter du code dans le processus de substitution, vous devez utiliser le drapeau e.

$numOfChar = 10;

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

Cela ajoutera $numOfChar espace au début de votre texte. Pour le faire pour chaque ligne du texte, utilisez l'-p Drapeau (pour un traitement rapide, une ligne):

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

ou si cela fait partie d'un script plus important, utilisez le -g et -m drapeaux (-g Pour Global, c'est-à-dire une substitution répétée et -m faire ^ Match au début de chaque ligne):

$n = 10;
$text =~ s/^(.*)/' ' x $n . $1/mge;
26
kixx

Votre expression régulière peut être écrite comme suit:

$numOfChar = 10;

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

mais - vous pouvez le faire avec:

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

Ou sans utiliser Regexps du tout:

$_ = ( ' ' x $numOfChar ) . $_;
15
user80168

Tu as raison. Perl's x opérateur répète une chaîne plusieurs fois.

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

EDIT: Pour ce faire dans une expression régulière, ce serait probablement le meilleur (A.K.A. La plupart des personnes de maintenance conviviales) de simplement affecter la valeur à une autre variable.

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

Il existe des moyens de le faire sans une variable supplémentaire, mais ce n'est que ma 0,02 $ qu'il sera plus facile de maintenir si vous le faites de cette façon.

EDIT: J'ai corrigé mon regex. Désolé, je ne l'ai pas lu la première fois.

8
Chris Lutz