2013-03-13 17 views
5

ho visto da qualche parte invece di usare chomp in perl, possiamo usare alcune espressioni regolari per ottenere lo stesso compito. Qualcuno può dire che cosa è l'espressione regolare incontrerà chomp in perlEspressione regolare equivalente a chomp

Grazie in anticipo

+0

puoi dare un esempio del tuo caso? – Raptor

+1

Non dovresti usare un'espressione regolare se esiste un'alternativa semplice – Lorkenpeist

+0

@Lorkenpeist TIMTOWTDI, Se vuoi cercarli :) – gaussblurinc

risposta

10

Che chomp fa è rimuovere il valore del $/ dalla fine della sua stringa argomento (o $_ se nessun argomento). Così l'espressione regolare equivalente sarebbe:

s#\Q$/\E\z##; 

Nota l'uso di altri delimitatore per s/// per evitare problemi con la variabile $/.

Tuttavia, non vi è alcun vantaggio nell'utilizzare una regex, piuttosto il contrario. Questa è una domanda puramente accademica, secondo me.

+0

una risposta più precisa! – Alec

+3

no, 's # \ Q $/\ z ##' (pedanticamente, con 'defined $/&&! Ref $ /', più un caso speciale per '$/eq ''') – ysth

+1

ciao, In realtà chomp rimuove il \ n alla fine della linea .. va bene se hai un file creato in ambiente Linux. considera che hai creato un file in ambiente Windows, così alla fine della riga avrà \ r \ n per la nuova linea .. se usi chomp, rimuoverà solo \ n non \ r .. quindi "= ~ s/\ n $//;" l'espressione regolare sarà migliore suppongo che – user2163744

5

Almeno 995 volte su 1000 (con la notevole eccezione di dati separati da tabulazione) che si desidera

s/\s+\z//; 

invece di

chomp; 

Gestisce spazi finali (che non dovrebbe mai essere significativo), terminazioni di linea di Windows e terminazioni di linea unix.

+2

Lo spazio vuoto finale è legittimamente significativo se, per esempio, i dati sono separati da tabulazioni e hanno dei campi vuoti finali. Questo metodo rimuoverà quei campi così come qualsiasi carattere separatore di record. Generalmente 's/[\ r \ n] + \ z //' è più sicuro. – Borodin

+0

@Borodin, è come suggerire di rimuovere le ruote da una macchina per renderla più sicura. Potrebbero esserci alcuni usi perfettamente accettabili per le auto senza ruote, ma il resto del tempo li lasci. 's/[\ r \ n] + \ z //' è stupido, non più sicuro. Usalo quando ti occupi di TSV, ma non il resto del tempo. – ikegami

+0

@ SinanÜnür: Niente affatto. Un campo vuoto dovrebbe essere rappresentato come una stringa vuota; un campo inesistente dovrebbe produrre "undef". Cosa ti aspetti da dati come '3 \ t \ t5'? Dovrebbe esserci davvero qualcosa di speciale nel percorrere i campi vuoti? – Borodin