2012-09-17 18 views
9

ho una variabile che viene immesso al prompt:Aggiungendo una variabile stringa in una stringa fissa in Perl

my $name = <>; 

Voglio aggiungere una stringa fissa '_one' a questo (in una variabile indipendente).

E.g. se $name = Smith allora diventa 'Smith_one'

Ho provato molti modi diversi, che non mi danno i giusti risultati, come ad esempio:

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

^La _one appare sulla riga successiva quando ho stamparlo e quando Lo uso, il _one non è incluso affatto.

anche:

my $one = $name."_one"; 

^Il '_one' appare nella parte inizio della stringa.

E:

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

Nessuno di questi producono il risultato che voglio, quindi devo essere manca qualcosa legato al modo in cui l'ingresso è formattato dal prompt, forse. Idee apprezzate!

risposta

21

Il problema non è correlato all'appendamento di stringhe: quando si legge una riga (ad esempio tramite <>), il separatore di immissione del record è incluso in tale stringa; questo di solito è una nuova riga \n. Per rimuovere il ritorno a capo, chomp la variabile:

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" 

interpolare una variabile in una stringa, di solito non è necessario il ${name} sintassi utilizzata. Queste linee saranno tutti aggiungere _one alla stringa e creare una nuova stringa:

"${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. 

E questo si aggiungerà _one alla stringa ed ancora conservarlo in $name:

$name .= "_one" 
+0

ahhh che è interessante circa il ritorno a capo personaggio - chomp risolve immediatamente il problema! Avevo provato anche quei metodi di aggiunta, senza fortuna - ma ora funzionano tutti! Grazie! – dgBP

+2

Divertente; Stavo pensando quanto sia meglio usare '" $ {name} _one "' di costrutti awkward come '" $ name \ _one "' o '$ name. "_one" '. –

+0

@ JonathanLeffler Grazie per la vostra modifica. A questo punto, mi trovo anche nel campo "$ {foo}' sintassi chiaro, non anacronistico di bash-ismo ", e che i miei suggerimenti originali erano peggiori. Ho modificato di conseguenza. – amon

Problemi correlati