2012-09-17 9 views
9

tengo una variable que se introduce en el símbolo:Al añadir una variable de cadena para una cadena fija en Perl

my $name = <>; 

Quiero añadir una cadena fija '_one' a esto (en una variable independiente).

E.g. Si $name = Smith entonces se convierte en 'Smith_one'

He intentado varias diversas maneras, que no me dan los resultados deseados, tales como:

my $one = "${name}_one"; 

^La _one aparece en la línea siguiente al imprimir hacia fuera y cuando Lo uso, el _uno no está incluido en absoluto.

también:

my $one = $name."_one"; 

^La '_one' aparece en la a partir de la cadena.

Y:

my $end = '_one'; 
my $one = $name.$end; 
or 
my $one = "$name$end"; 

Ninguno de ellos produce el resultado que quiero, por lo que debe estar pasando algo relacionado con la forma en que la entrada está formateado desde el símbolo, tal vez. Ideas apreciadas!

Respuesta

21

Su problema no está relacionado con la cadena que se agrega: Cuando lee una línea (por ejemplo, a través de <>), el separador de entrada de registro es incluido en esa cadena; esto es generalmente una nueva línea \n. Para quitar el salto de línea, chomp la variable:

my $name = <STDIN>; # better use explicit filehandle unless you know what you are doing 
    # now $name eq "Smith\n" 
    chomp $name; 
    # now $name eq "Smith" 

para interpolar una variable en una cadena, por lo general no necesita la sintaxis ${name} que utilizó. Estas líneas todo anexará _one a la cadena y crear una nueva cadena:

"${name}_one" # what you used 
    "$name\_one" # _ must be escaped, else the variable $name_one would be interpolated 
    $name . "_one" 
    sprintf "%s_one", $name 
    # etc. 

Y esto añadirá _one a la cadena y todavía almacenarlo en $name:

$name .= "_one" 
+0

ahhh que es interesante acerca de la nueva línea personaje - ¡chomp resuelve inmediatamente el problema! También probé esos métodos de anexión sin suerte, pero ahora todos funcionan. ¡Gracias! – dgBP

+2

Gracioso; Estaba pensando en cuánto mejor usar '" $ {name} _one "' que construcciones torpes como '" $ name \ _one "' o '$ name. "_one" '. –

+0

@JonathanLeffler Gracias por su edición. Por ahora, también estoy en el campo "' $ {foo} 'es una sintaxis clara, no un anacronismo bash-ismo", y que mis sugerencias originales eran peores. He editado en consecuencia. – amon

Cuestiones relacionadas