2009-03-22 16 views
22

Estoy aprendiendo Perl, así que por favor tengan paciencia conmigo para esta pregunta novato.¿Cómo repito un carácter n veces en una cadena?

¿Cómo repito un carácter n veces en una cadena?

Quiero hacer algo, como a continuación:

$numOfChar = 10; 

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

¿Recibe algún mensaje de error? – tstenner

Respuesta

24

Por defecto , las sustituciones toman una cuerda como parte para sustituir. Para ejecutar el código en el proceso de sustitución, debe utilizar el indicador e.

$numOfChar = 10; 

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

Esto añadirá $numOfChar espacio para el inicio de su texto. Para hacerlo para cada línea en el texto o bien utilizar la bandera -p (para un proceso rápido, una línea):

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

o si se trata de una parte de un guión más grandes usan las banderas -g y -m (-g para el mundial , es decir, repetida sustitución y -m para hacer ^ partido al comienzo de cada línea):

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

Tienes razón. El operador x de Perl repite una cadena varias veces.

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

EDIT: Para hacer esto dentro de una expresión regular, probablemente sería mejor (también conocido como mantenedor más amigable) para asignar el valor justo a otra variable.

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

Hay maneras de hacerlo sin una variable adicional, pero es sólo mi $ 0,02 que va a ser más fácil de mantener si lo haces de esta manera.

EDIT: arreglé mi regex. Lo siento, no lo leí bien la primera vez.

+1

Eso no funcionó. Creo que funciona solo dentro de print statement – chappar

+0

Para mí funciona con perl 5.10.0 – tstenner

+0

Estoy intentando algo como esto. s /^(.*)/ 'p' x $ numOfChar /; He modificado mi pregunta – chappar

15

Su expresión regular no se puede escribir como:

$numOfChar = 10; 

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

pero - usted puede hacerlo con:

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

o sin el uso de expresiones regulares en absoluto:

$_ = (' ' x $numOfChar) . $_; 
+0

Tenga en cuenta que esta respuesta ya no se aplica, porque chappar agregó una \ s * a su pregunta después de dar esta respuesta. – ysth

+1

Por el momento, ninguna de las respuestas se aplica realmente. Pero se puede arreglar fácilmente. Solo cambio: s/^/'' x $ numOfChar/e; en: s/^ \ s */'' x $ numOfChar/e; –

Cuestiones relacionadas