2011-03-28 15 views
10

Mam ciąg, który chcę podzielić. Ale separator jest określany w czasie wykonywania, więc muszę go przekazać jako zmienną.Dlaczego podział na `|` (pipe) nie działa zgodnie z oczekiwaniami?

Coś takiego jak my @fields = split(/$delimiter/,$string); nie działa. jakieś pomysły?


Wejście:

abcd|efgh|23 

oczekiwany wynik:

abcd 
efgh 
23 
+2

Twój wkład, prawdziwa moc i oczekuje wyjście byłoby niezmiernie użyteczne informacje ... – Sean

+5

Nie mają "separator" masz "separator". "Ogranicznik" oznacza granice, tj. jest na obu końcach, jak podwójne cytaty. "Separator" przechodzi pomiędzy elementami, np. "|" w twoim przykładowym wprowadzeniu. – tadmc

+0

możliwy duplikat [Jak obsługiwać znaki specjalne w wyrażeniu Perla?] (Http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters-in-a-perl-regex) – daxim

Odpowiedz

19

Musisz uciec swój ogranicznik, ponieważ jest to znak specjalny w wyrażeniach regularnych.

Wariant 1:

$delimiter = quotemeta($delimiter); 
my @fields = split /$delimiter/, $string; 

Opcja 2:

my @fields = split /\Q$delimiter/, $string; 
+0

Aby uzyskać więcej informacji, zobacz: 'perldoc perlretut',' perldoc perlre' i wyszukaj/\\ Q/i zobacz 'perldoc -f quotemeta'. – shawnhcorey

+2

Argument "split" nie jest separatorem, ale separatorem. – tchrist

+0

Nie zgodnie z 'perldoc -f split':" Wszystko, co pasuje do PATTERN, jest traktowane jako ogranicznik oddzielający pola. " – Sean

Powiązane problemy