split
Divide la stringa ESPR in una lista di stringhe e restituisce
tale lista. Di default, i campi vuoti iniziali sono
mantenuti, mentre quelli in coda vengono cancellati (se tutti i campi sono vuoti,
vengono considerati essere in coda).
In un contesto scalare, restituisce il numero di campi
trovati e mette i risultati della divisione nell'array @_.
L'uso di split in un contesto scalare è tuttavia
deprecato, poiché sovrascrive gli argomenti
della vostra subroutine.
Se ESPR viene omessa, divide la stringa $_. Se
anche PATTERN viene omesso, divide la stringa in base
agli spazi (dopo aver saltato ciascuno spazio presente in
testa alla stringa). Qualunque cosa soddisfi PATTERN
è trattato come un delimitatore che separa i campi.
(Va notato che il delimitatore può essere più
lungo di un carattere.)
Se LIMITE viene specificato ed è positivo,
esso rappresenta il massimo numero di campi in cui
ESPR verrà divisa, però il numero
effettivo di campi restituiti dipende da quante volte
PATTERN è soddisfatto all'interno di ESPR.
Se LIMITE non viene specificato o vale zero, allora
i campi nulli in coda vengono omessi (cosa
che i potenziali utilizzatori di pop farebbero bene
a ricordare).
Se LIMITE è negativo, allora viene trattato come
se fosse stato specificato un valore di LIMIT
arbitrariamente grande. Va notato che dividere una ESPR
che vale stringa vuota, restituisce sempre una lista
vuota, qualunque sia il LIMITE specificato.
Un pattern che corrisponde alla stringa vuota (da non
confondere con il pattern vuoto //, che è
solo un elemento dell'insieme di pattern che corrispondono
alla stringa vuota) dividerà il valore di
ESPR in caratteri separati in corrispondenza a ciascun
punto in cui il PATTERN viene soddisfatto. Ad esempio:
print join(':', split(/ */, 'ohi la'));
produce l'output 'o:h:i:l:a'.
Come caso speciale di split, utilizzare il pattern vuoto // corrisponde specificamente
al match della sola stringa vuota, e non deve essere confuso con l'uso di // per indicare "l'ultimo pattern
soddisfatto con successo". Così, per split, il seguente:
print join(':', split(//, 'ohi la'));
produce l'output 'o:h:i: :l:a'.
Quando ci sono dei match di ampiezza positiva all'inizio (o alla fine)
della stringa, vengono prodotti dei campi vuoti in testa (o in coda);
un match di ampiezza zero all'inizio (o alla fine) della stringa non
produce un campo vuoto. Per esempio:
print join(':', split(/(?=\w)/, 'ohi la!'));
produce l'output 'o:h:i :l:a!'.
Il parametro LIMITE può essere usato per dividere
parzialmente una linea
($login, $passwd, $rimanente) = split(/:/, $_, 3);
Quando si assegna ad una lista, se LIMITE viene omesso, oppure è
zero, Perl fornisce un valore di LIMITE che è superiore di una
unità al numero di variabili contenute nella lista, per evitare
del lavoro non necessario. Per la lista sopra, LIMITE sarebbe stato
pari a 4, di default. In applicazioni dove il tempo è un
fattore critico, è necessario non dividere in più
delle parti di cui si ha veramente bisogno.
Se il PATTERN contiene delle parentesi, vengono creati
elementi aggiuntivi nella lista, per ciascuna delle
sottostringhe corrispondenti all'interno del delimitatore.
split(/([,-])/, "1-10,20", 3);
produce il valore di lista
(1, '-', 10, ',', 20)
Se aveste in $header l'header di un normale messaggio
email Unix, potreste dividerlo in campi e rispettivi
valori in questo modo:
$header =~ s/\n\s+/ /g; # mette a posto le continuazioni delle linee
%hdrs = (UNIX_FROM => split /^(\S*?):\s*/m, $header);
Il pattern /PATTERN può essere sostituito da
una espressione per specificare pattern che variano
a tempo di esecuzione. (Per effettuare una compilazione,
a tempo di esecuzione, una volta sola, usate
/$variabile/o).
Come caso speciale, lo specificare un PATTERN costituito da uno spazio
(' ') suddividerà in base agli spazi, esattamente come fa split
quando viene chiamata senza argomenti. Dunque, split(' ') può
essere utilizzata per emulare il comportamento predefinito di awk,
mentre invece split(/ /) vi restituirà tanti campi iniziali
nulli quanti sono gli spazi all'inizio della stringa.
Una split su /\s+/ è equivalente ad una split(' '), tranne
che lo spazio bianco ad inizio stringa genera un primo campo nullo. Una
split senza argomenti in realtà, internamente, è una
split(' ', $_).
Un PATTERN di /^/ viene trattato come se fosse /^/m poiché,
altrimenti, non sarebbe di grande utilità.
Esempio:
open(PASSWD, '/etc/passwd');
while (<PASSWD>) {
chomp;
($login, $passwd, $uid, $gid,
$gcos, $home, $shell) = split(/:/);
#...
}
Come avviene per la normale ricerca di pattern, ogni parentesi di cattura
che non viene trovata in un'operazione di split() sarà impostata ad
undef al momento della restituzione dei risultati:
@campi = split /(A)|B/, "1A2B3";
# @campi e` (1, 'A', 2, undef, 3);