Come posso dividere una stringa lungo un separatore di stringa fornito dall'utente in Perl?
Domanda
Il mio codice funzionava bene e ora si sta rompendo. Una riduzione del problema è la seguente: voglio dividere una stringa di origine (da un database, ma non è importante) in un separatore. Il separatore non è fisso, ma fornito dall'utente, in una stringa. Prima lo facevo:
@results = split($splitString, $sourceStr);
Ma questo si interrompe quando gli utenti chiedono il segno più (+) come separatore. Il messaggio è un po 'enigmatico:
Quantifier follows nothing in regex; marked by <-- HERE in m/+ <-- HERE
La mia comprensione è che si rompe perché split non prevede una stringa, ma una regexp. Tuttavia, non riesco a trovare un modo per sfuggire a $ splitString in un modo che funzioni. Ecco il mio esempio di giocattolo:
my $s = 'string 1 + $splitChar + string 2';
my $splitChar = "+";
my @result = split(/\\$splitChar/, $s);
print "num of results ".scalar(@result)."\n";
foreach my $value (@result) {
print "$value\n";
}
Ma non si divide affatto. Ho provato diverse varianti, nessuna delle quali ha funzionato. Si noti che il separatore specificato dall'utente è probabilmente limitato a un carattere, ma una soluzione multi-carattere sarebbe migliore.
(e sì, potrei scrivere la mia funzione di divisione specializzata, ma non è questo il punto).
(il $ splitChar
nell'esempio di stringa con virgolette singole è intenzionale, suppongo sia chiaro il perché).
Soluzione
Il primo argomento di split
è un modello :
#!/usr/bin/perl
use strict;
use warnings;
my $sep = '+';
my $source = 'one+two+three';
my @results = split /\Q$sep\E/, $source;
use Data::Dumper;
print Dumper \@results;
Vedi anche perldoc -q " quotare una variabile "
.
Altri suggerimenti
Il problema è che + è usato come metacarattere per indicare "uno o più" degli elementi precedenti (quindi stai chiedendo uno o più, senza specificare quello che vuoi)
La risposta di Sinan è buona, e controlla anche la quotemeta .