Wie kann ich geteilt eine Zeichenfolge entlang eines vom Benutzer bereitgestellte Zeichenfolge Separators in Perl?

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

  •  05-07-2019
  •  | 
  •  

Frage

Mein Code verwendet funktionieren, und jetzt bricht es. Eine Verringerung des Problems ist die folgende: Ich möchte eine Quelle String aufgeteilt werden (aus einer Datenbank, aber das ist nicht wichtig) in einem Separator. Der Separator ist nicht festgelegt, aber Benutzer zur Verfügung gestellt, in einer Zeichenkette. Früher habe ich das tun:

@results = split($splitString, $sourceStr);

Aber das bricht, wenn der Benutzer für das Pluszeichen fragt (+) als Trennzeichen. Die Nachricht ist ein wenig kryptisch:

Quantifier follows nothing in regex; marked by <-- HERE in m/+ <-- HERE

Mein Verständnis ist, dass es bricht, weil Split keinen String nicht erwarten, aber einen regulären Ausdruck. Allerdings kann ich es nicht geschafft, einen Weg zu finden, die $ split in einer Art und Weise zu entkommen, das funktioniert. Hier ist mein Spielzeug Beispiel:

  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";   
  }

Aber es ist überhaupt nicht aufgespalten. Ich habe versucht, eine Reihe von Variationen, von denen keines gearbeitet. Beachten Sie, dass der vom Benutzer angegebenen Separator wahrscheinlich auf ein Zeichen beschränkt ist, sondern eine Multi-Charakter Lösung wäre besser.

(und ja, ich konnte meine eigene spezielle Split-Funktion schreiben, aber es ist nicht der Punkt).

(die $splitChar in dem einzigen String in Anführungszeichen Beispiel absichtlich sind, nehme ich an, es ist klar, warum).

War es hilfreich?

Lösung

Das erste Argument für split ist ein Muster:

#!/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;

Siehe auch perldoc -q "quote a variable" .

Andere Tipps

Das Problem ist, dass + als metacharacter verwendet wird ‚eine oder mehr‘ des vorhergehenden Artikel anzuzeigen (so fragen Sie für einen oder mehrere, ohne zu spezifizieren, was es ist, Sie mögen)

Sinan Antwort ist gut, und schauen Sie sich die quotemeta Funktion als auch .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top