(contributo di brian d foy)
Una sostituzione può farlo per voi. Per una singola linea,
volete sostituire tutti gli spazi ad inizio/fine stringa con nulla.
Potete farlo con un paio di sostituzioni.
s/^\s+//;
s/\s+$//;
Potete anche scriverlo come una singola sostituzione, ma anche se
funziona, l'istruzione congiunta è più lenta di quelle
separate. Tuttavia per voi questo potrebbe non avere importanza.
s/^\s+|\s+$//g;
In questa espressione regolare, l'alternativa [|, NdT] effettua un match o
all'inizio o alla fine della stringa dato che le ancore [^ e $, NdT] hanno
una precedenza piEa<ugrave> bassa rispetto all'alternativa. Con l'opzione
/g, la sostituzione effettua tutti i possibili match, dunque li
ottiene entrambi. Ricordate, i ritorni a capo a fine linea trovano corrispondenza
in \s+ e l'ancora $ può effettuare il match sulla parte fisica
della fine della stringa, dunque anche il ritorno a capo scompare. Aggiungete
semplicemente il ritorno a capo all'output, che ha l'ulteriore vantaggio di
preservare le linee "vuote" (formate interamente da spazi) che verrebbero
rimosse tutte dalla la parte ^\s+.
while( <> )
{
s/^\s+|\s+$//g;
print "$_\n";
}
Per una stringa su più linee, potete applicare l'espressione regolae
ad ogni linea logica della stringa aggiungendo l'opzione /m (che sta per
"linee multiple"). Con l'opzione /m, $ effettua un match prima di
un ritorno a capo interno e dunque non lo rimuove. Continua però a
rimuovere il ritorno a capo alla fine della stringa.
$stringa =~ s/^\s+|\s+$//gm;
Ricordate che le linee che consistono interamente di spazi spariranno, visto
che la prima parte dell'alternativa può effettuare il match dell'intera
stringa e sostituirla con nulla. Se servisse mantenere le linee vuote interne,
dovreste fare un po' di lavoro in più. Invece di effettuare il match su
ogni spazio (visto che questo include i ritorni a capo), effettuate il match
semplicemente sull'altro spazio.
$stringa =~ s/^[\t\f ]+|[\t\f ]+$//mg;
|