2011-01-07 12 views
5

Secondo il perldoc, la sintassi per divisione è:Perl modello spaccatura

split /PATTERN/,EXPR,LIMIT 

Ma la PATTERN può anche essere una stringa singolo o doppio citato: split "PATTERN", EXPR. Che differenza fa?

Modifica: una differenza di cui sono a conoscenza è la suddivisione sui backslash: split /\\/ rispetto a split '\\'. Il secondo modulo non funziona.

+0

La differenza che si sta osservando è causata dall'interpolazione. '/ \\ /' è un pattern contenente un singolo backslash. ''\\'' è una stringa contenente una singola barra rovesciata. Quando quella stringa viene interpretata come un pattern è come se avessi scritto '/ \ /', che non è valido. Per ottenere lo stesso comportamento devi raddoppiare le barre rovesciate: ''\\\\'' –

+0

@Michael: queste sono chiamate sequenze di escape backslash, non di interpolazione. –

risposta

6

sembra che utilizza come "un'espressione per specificare modelli":

Il pattern/PATTERN/può essere sostituito con un'espressione per specificare modelli che variano in fase di esecuzione. (Per fare runtime compilation una sola volta, utilizzare /$ variabile/o.)

edit: ho provato con questo:

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

Fatta eccezione per il caso speciale ' ', sembra proprio come un'espressione regolare.

+0

Un esempio in cui non funziona: 'split/\\ /' vs 'split '\\''. – planetp

+1

Per essere più precisi, 'split EXPR, ...' (dove EXPR non è un letterale '/.../') equivale approssimativamente a 'do {my $ pattern = EXPR; split/$ pattern /, ...} '(eccetto per il caso speciale '' ''). Ecco perché ''\\'' non funziona; il risultante '$ modello' contiene solo 1 barra rovesciata, e hai bisogno di 2 per avere un'espressione regolare valida. – cjm

0

Due regole osservabili:

  • il caso particolare split(" ") equivale a split(/\s+/).
  • per tutto il resto (pare-non chiodo me), split("something") è pari a split(/something/)
+0

Non lo tratta affatto con '\ Q \ E'; lo tratta come '/ qualcosa /'. –

+0

Non è corretto. Una stringa si comporta proprio come una regex standard. – krakover

+0

'split ''' è come 'split/\ s + /' tranne che il precedente salta un campo vuoto iniziale. – ysth

1

Credo che ci sia alcuna differenza. Anche un modello di stringa viene interpretato come un'espressione regolare.

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

Come si vede, il delimitatore viene interpretato come un'espressione regolare, non una stringa letterale.

Quindi, è quasi lo stesso - con una importante eccezione: split(" ",...) e split(/ /,...) sono diversi.

Preferisco usare /PATTERN/ per evitare confusione, è facile dimenticare che è un'espressione regolare altrimenti.

2

PATTERN viene sempre interpretato come ... beh, un modello - mai come valore letterale. Può essere o un regex o una stringa. Le stringhe sono compilate per regex. Per la maggior parte il comportamento è lo stesso, ma ci possono essere differenze sottili causate dalla doppia interpretazione.

La stringa '\\' contiene solo una barra rovesciata. Se interpretato come un modello, è come se tu avessi scritto /\/, che non è valido:

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

Oops!

Inoltre, ci sono due casi particolari:

  • Il modello vuoto //, che divide sulla stringa vuota.
  • Un unico spazio ' ', che si divide su spazi dopo il primo ritaglio di qualsiasi spazio vuoto iniziale o finale di .

1. regex possono essere forniti sia in linea /.../ o tramite un precompilato qr// stringa tra virgolette.

Problemi correlati