Página 1 de 1

Partir cadenas con split "|"

NotaPublicado: 2015-11-30 07:03 @336
por alperez
Hola.

Llevo un par de horas ya con esto y no veo solución. Estoy intentando separar dos cadenas con el siguiente formato:

/AS/EVENTSPRING/PARAM_SETTINGS/THRESHOLDS/PATROLAGENT/PATROLAGENT/PAWorkRateExecsMin|1,0 0 100 0 0 2,0 0 80 1 2 0,0 80 100 0 0 0

La separación la estoy haciendo en la "|" con el comando split() a dos variables. Pero el resultado que esperaba no me sale. El comando es el siguiente:

($nombre_variable,$datos)=split("|", $thresholds);

La salida:
El nombre de la variables es : /
El Dato es : A


No entiendo por qué me coge en la primera variable la '/' y en la segunda la 'A' en vez de en la primera: /AS/EVENTSPRING/PARAM_SETTINGS/THRESHOLDS/PATROLAGENT/PATROLAGENT/PAWorkRateExecsMin y en la segunda 1,0 0 100 0 0 2,0 0 80 1 2 0,0 80 100 0 0 0.

He probado en el split() con '' con "" con \\, y con ninguna funciona.

Saludos.

Re: Partir cadenas con split "|"

NotaPublicado: 2015-11-30 07:19 @347
por alperez
Hola,

Ya lo he solucionado con las funciones index(), lenght() y substr().

Gracias.

Re: Partir cadenas con split "|"

NotaPublicado: 2015-11-30 08:01 @375
por explorer
El problema es que '|' es un metacarácter especial para las expresiones regulares. Quiere decir que tiene un significado especial para los patrones.

Su significado es de "alternancia" entre dos valores posibles. Entonces, cuando ponemos el patrón "|" en un split(), lo que está haciendo, en realidad, es partir la cadena por cada carácter de la cadena. Por eso te daba ese resultado.

Entonces, lo que hay que hacer es "escapar" su significado. Se puede hacer con '\' o con '[]':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $thresholds = '/AS/EVENTSPRING/PARAM_SETTINGS/THRESHOLDS/PATROLAGENT/PATROLAGENT/PAWorkRateExecsMin|1,0 0 100 0 0 2,0 0 80 1 2 0,0 80 100 0 0 0';
  2.  
  3. my ($nombre_variable,$datos) = split(/[|]/, $thresholds);
  4.  
  5. say "[$nombre_variable]"; # [/AS/EVENTSPRING/PARAM_SETTINGS/THRESHOLDS/PATROLAGENT/PATROLAGENT/PAWorkRateExecsMin]
  6. say "[$datos]";           # [1,0 0 100 0 0 2,0 0 80 1 2 0,0 80 100 0 0 0]
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4