¿Cómo puedo dividir una cadena a lo largo de un separador de cadena proporcionado por el usuario en Perl?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Mi código solía funcionar bien, y ahora se está rompiendo. Una reducción del problema es la siguiente: quiero dividir una cadena de origen (de una base de datos, pero eso no es importante) en un separador. El separador no es fijo, pero proporcionado por el usuario, en una cadena. Solía ??hacer eso:

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

Pero esto se interrumpe cuando los usuarios solicitan el signo más (+) como separador. El mensaje es un poco críptico:

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

Tengo entendido que se rompe porque la división no espera una cadena, sino una expresión regular. Sin embargo, no puedo encontrar una manera de escapar de la $ splitString de una manera que funcione. Aquí está mi ejemplo de juguete:

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

Pero no se divide en absoluto. Probé varias variaciones, ninguna de las cuales funcionó. Tenga en cuenta que el separador especificado por el usuario probablemente esté limitado a un carácter, pero una solución de múltiples caracteres sería mejor.

(y sí, podría escribir mi propia función de división especializada, pero no es el punto).

(el $ splitChar en el ejemplo de cadena de comillas simples es a propósito, supongo que está claro por qué).

¿Fue útil?

Solución

El primer argumento de split es un patrón :

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

Ver también perldoc -q " cotizar una variable " .

Otros consejos

El problema es que + se usa como un metacarácter para indicar 'uno o más' de los elementos anteriores (por lo que está solicitando uno o más, sin especificar qué es lo que quiere)

La respuesta de Sinan es buena, y echa un vistazo a la función quotemeta también .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top