Come posso dividere una stringa lungo un separatore di stringa fornito dall'utente in Perl?

StackOverflow https://stackoverflow.com/questions/1206464

  •  05-07-2019
  •  | 
  •  

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é).

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top