Con expresiones regulares es muy sencillo: el patrón que buscamos es contenido entrecomillado doble:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.14;
my $string = q("hola" "chau" "dos" "tres");
while ( $string =~ /("(?:.*?)")/g) {
say $1; # "hola", "chau", "dos", "tres"
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Con split... pues depende...
Si estamos seguros que los contenidos,
a) están separados por uno o más espacios en blanco, y
b) NO hay espacios en blanco dentro de los contenidos,
entonces se puede resolver muy fácilmente: usando los espacios en blanco como delimitadores.
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.14;
my $string = q("hola" "chau" "dos" "tres");
my @resultado = split " ", $string;
say join ",", @resultado; # "hola","chau","dos","tres"
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Pero... si no se cumplen esas dos reglas, habrá que complicar un poco más la expresión regular. Debería funcionar igual que en la primera solución que usamos comillas dobles como anclas para buscar el contenido, pero esta vez tenemos que hacer lo contrario: queremos buscar las comillas dobles que delimitan el espacio que separa los contenidos. Y no debemos permitir que formen parte de la partición, pues entonces las perdemos (como decías en tu mensaje).
Para ello, usaremos expresiones regulares extendidas.
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.14;
my $string = q("hola" "chau" "dos y medio" "tres");
my @resultado = split /(?<=")\s+(?=")/, $string;
say join ",", @resultado; # "hola","chau","dos y medio","tres"
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Con los paréntesis de patrones extendidas, estamos buscando por comillas dobles separadas por uno o más espacios en blanco, PERO sin formar parte del delimitador (el espacio en blanco), por lo que siguen formando parte del contenido que queremos guardar.
Más información en tu propio ordenador en
perldoc perlre,
y en la Web (
traducido al español).