2009-02-02 35 views

risposta

8
s/(?=..$)/:/ 

Non utilizzare il suggerimento di uova di $&. perldoc perlvar:

L'utilizzo di questa variabile in un punto qualsiasi di un programma impone una notevole riduzione delle prestazioni su tutte le corrispondenze di espressioni regolari. Vedi "BUG".

+0

Come sempre, ci sono più di un modo. C'è una penalità per le prestazioni sì, ma è stato il primo modello che mi è venuto in mente (sì, sono un ragazzo sed originario ovviamente), ed è probabilmente abbastanza veloce in questo caso, non credi? :) – falstro

+0

era abbastanza veloce .. è comunque una piccola sceneggiatura ... la soluzione di ayrnieu funzionava troppo – CheeseConQueso

+0

Il punto non è se è veloce o meno. Il punto è che i nuovi arrivati ​​non dovrebbero prendere l'abitudine di usare $ & in primo luogo. – innaM

1

Si potrebbe provare questo:

s/..$/:$&/ 

Si abbina due caratteri alla fine della stringa, e lo sostituisce con i due punti, e la stringa corrispondente (vale a dire i due personaggi).

MODIFICA
Risolto back-end perl equivalente perl.

+0

ok grazie ... sì stavo per dire che non funzionava – CheeseConQueso

+0

bello .. non v'è – CheeseConQueso

+0

Ok, quindi isn' t l'espressione più ottimizzata, ma è facile da capire e fa il trucco, come è stato inutile (come in downvote)? Non sta svalutando la risposta migliore nel modo SO? – falstro

-2

The Perl equivalente di sed & è $ &, quindi dovrebbe essere: risposta

$s = s /..$/:$&/s; 
0

di uova "opere", ma la sua espressione regolare piuttosto inobvious.

avrei più andare per

s/(^.*)(..$)/$1:$2/ 

perché ho appena amore backrefs.

La sua esagerazione per quello che stai facendo, ma per me è più semanticamente espressivo.

+0

la prima cattura è un po 'sprecata, perché non semplicemente s /(..$)/:$ 1 /? – user55400

+0

Anche se la prima parte è veramente ridondante, è molto più leggibile. (Almeno al modo in cui analizzo la regex) –

+0

+1 blixtor. @Kent: anche se in questo caso non fa alcuna differenza pratica, la tua risposta originale è più lenta dal momento che Perl dovrà tornare indietro di due caratteri per abbinare il finale "..". Se quella ".." era un'espressione più complicata, l'iniziale ". *" Poteva facilmente renderlo * molto * più lento. –

9

È inoltre possibile utilizzare così .....

my $string = "1200"; 
substr $string, -2, 0, ':'; 

# $string => '12:00'; 
+0

Immagino che il substr() sia significativamente più veloce e più facile da leggere e più intuitivo. –

+0

Più intuitivo solo se non si conosce la regex abbastanza bene. – PEZ

+0

questo sembra intuitivo ... non so perché, ma ha creato 20 ~ linee nel file csv e poi ha preso un dump e mi ha dato questo errore ... substr esterno di stringa in ./test3 riga 237. - La mia migliore ipotesi è che ha avuto un valore pari a 0, che si verifica nei miei dati e non è un dato errato, implica semplicemente un evento diff – CheeseConQueso

Problemi correlati