2013-03-13 18 views
5

widziałem gdzieś zamiast używać chomp w perlu możemy użyć wyrażenia regularnego, aby osiągnąć to samo zadanie. Może ktoś powiedzieć co to jest wyrażenie regularne spotka chomp w PerluWyrażenie regularne równoważne chomp

góry dziękuję

+0

czy możesz podać przykład swojej sprawy? – Raptor

+1

Naprawdę nie powinieneś używać wyrażeń regularnych, jeśli istnieje prosta alternatywa – Lorkenpeist

+0

@Lorkenpeist TIMTOWTDI, Jeśli chcesz je wyszukać :) – gaussblurinc

Odpowiedz

10

Co chomp robi to usunąć wartość $/ od końca jej argumencie (lub $_ jeśli żaden argument). Więc odpowiednikiem regex byłoby:

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

Uwaga stosowanie innego separatora dla s/// aby uniknąć problemów ze zmienną $/.

Jednak nie ma korzyści z używania takiego wyrażenia regularnego, a wręcz przeciwnie. To jest czysto akademickie pytanie, moim zdaniem.

+0

dokładniejsza odpowiedź! – Alec

+3

nie, 's # \ Q $/\ z ## '(pedantycznie, z' zdefiniowanym $/&&! Ref $/', plus specjalny przypadek dla' $/eq' '') – ysth

+1

cześć, Właściwie chomp usuwa \ n na końcu linii ... jest dobrze, jeśli masz plik utworzony w środowisku Linux. rozważ, że utworzyłeś plik w środowisku Windows, więc koniec linii będzie \ r \ n dla nowej linii .. jeśli użyjesz chomp to usunie tylko \ n nie \ r .. więc "= ~ s/\ n $//; "; wyrażenie regularne będzie lepsze, jak sądzę, – user2163744

5

przynajmniej 995 razy na 1000 (z chlubnym wyjątkiem danych rozdzielone tabulatorami) chcesz

s/\s+\z//; 

zamiast

chomp; 

Obsługuje końcowe białe znaki (które nie powinny nigdy być znaczące), zakończenia linii Windows i zakończenia linii unix.

+2

Sprowadzanie białych znaków jest zasadnie ważne, jeśli, powiedzmy, dane są rozdzielane tabulatorami i kończą się pustymi polami. Ta metoda usunie te pola, jak również dowolne znaki separatora rekordów. Zasadniczo 's/[\ r \ n] + \ z //' jest bezpieczniejsze. – Borodin

+0

@Borodin, To tak, jakby sugerować, aby zdjąć koła z samochodu, aby było bezpieczniej. Może być kilka całkowicie akceptowalnych zastosowań dla samochodów bez kół, ale przez resztę czasu, możesz je zostawić. 's/[\ r \ n] + \ z //' jest głupie, nie bezpieczniejsze. Użyj go, gdy masz do czynienia z TSV, ale nie przez resztę czasu. – ikegami

+0

@ SinanÜnür: Wcale nie. Puste pole powinno być przedstawione jako pusty ciąg; nieistniejące pole powinno dawać 'undef'. Czego można oczekiwać od danych takich jak '3 \ t \ t5'? Czy naprawdę powinno być coś specjalnego o ciągnięciu pustych pól? – Borodin