2011-01-07 8 views
5

Według perldoc, składnia do rozłamu jest:Perl Podział wzór

split /PATTERN/,EXPR,LIMIT 

Ale PATTERN może też być jedno- lub dwukrotnie cudzysłowie: split "PATTERN", EXPR. Jaką to robi różnicę?

Edytuj: Różnica, o której wiem, że dzieli się na ukośniki odwrotne: split /\\/ vs split '\\'. Drugi formularz nie działa.

+0

Różnica, którą widzisz, wynika z interpolacji. '/ \\ /' to wzorzec zawierający pojedynczy ukośnik odwrotny. '\\ '' jest łańcuchem zawierającym pojedynczy ukośnik odwrotny. Kiedy ten ciąg jest interpretowany jako wzorzec, to tak jakbyś napisał '/ \ /', który jest nieprawidłowy. Aby uzyskać to samo zachowanie, trzeba podwoić ukośniki odwrotne: '' \\\\ '' –

+0

@Michael: są to sekwencje specjalne odwrotnego ukośnika, a nie interpolacja. –

Odpowiedz

6

Wygląda na to, że wykorzystuje jako „wyraz określenia wzorów”:

Wzór/WZÓR/może być zastąpiony z wyrazem określić wzory które różnią się przy starcie. (Aby to zrobić Runtime kompilację tylko raz, użyj /$ zmienna/O.)

edit: ja testowałem to z tym:

my $foo = 'a:b:c,d,e'; 
print join(' ', split("[:,]", $foo)), "\n"; 
print join(' ', split(/[:,]/, $foo)), "\n"; 
print join(' ', split(/\Q[:,]\E/, $foo)), "\n"; 

wyjątkiem ' ' szczególnym przypadku, wygląda podobnie jak wyrażenie regularne.

+0

Jeden przykład, w którym nie: 'split/\\ /' vs 'split '\\''. – planetp

+1

Mówiąc dokładniej, 'split EXPR, ...' (gdzie WYRAŻ nie jest dosłownym '/.../') jest w przybliżeniu równoznaczne z 'do {my $ pattern = EXPR; split/$ pattern /, ...} '(z wyjątkiem specjalnego przypadku). Dlatego '' \\ ''nie działa; wynikowy wzór $ zawiera tylko 1 ukośnik odwrotny i potrzebujesz 2, aby mieć poprawne wyrażenie regularne. – cjm

0

Dwa obserwowalne zasady:

  • szczególny przypadek split(" ") jest równoważna split(/\s+/).
  • za wszystko inne (wydaje-nie gwóźdź mnie), split("something") jest równa split(/something/)
+0

Nie traktuje tego z '\ Q \ E' w ogóle; po prostu traktuje to jako '/ coś /'. –

+0

To nie jest poprawne. Ciąg zachowuje się jak standardowe wyrażenie regularne. – krakover

+0

'split ''' jest podobne do 'split/\ s + /' z tą różnicą, że poprzednia pomija wiodące puste pole. – ysth

1

wierzę, nie ma różnicy. Wzorzec ciągu jest również interpretowany jako wyrażenie regularne.

1
perl -e 'print join("-",split("[a-e]","regular"))'; 
r-gul-r 

Jak widać, ogranicznik interpretowany jest jako wyrażenie regularne, a nie literał łańcuchowy.

Jest to w większości taki sam - z jednym ważnym wyjątkiem: split(" ",...) i split(/ /,...) są różne.

Wolę używać /PATTERN/, aby uniknąć nieporozumień, łatwo można zapomnieć, że w przeciwnym razie jest to wyrażenie regularne.

2

PATTERN jest zawsze interpretowany jako ... no, wzór - nigdy jako wartość dosłowną. Może to być regex lub ciąg znaków. Ciągi są kompilowane do wyrażeń regularnych. W przeważającej części zachowanie jest takie samo, ale mogą istnieć subtelne różnice spowodowane podwójną interpretacją.

Łańcuch '\\' zawiera tylko pojedynczy ukośnik odwrotny. Kiedy interpretować jako wzorzec, to tak jakbyś napisał /\/, który jest nieprawidłowy:

C:\>perl -e "print join ':', split '\\', 'a\b\c'" 
Trailing \ in regex m/\/ at -e line 1. 

Ups!

Dodatkowo, istnieją dwa szczególne przypadki:

  • Pusty wzór //, który dzieli się na pusty ciąg.
  • Pojedyncza spacja ' ', która dzieli się na białe znaki po pierwszym przycięciu wszystkich początkowych lub końcowych białych znaków.

1. regexes może być zasilany bezpośrednio w tekście /.../ lub poprzez skompilowany qr// cudzysłowie.