Aquí hay una solución con split:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use strict;
- use warnings;
- use diagnostics;
- my $cabecera = 'var1 INT,var2 INT,var3 INT,var4 VARCHAR(10),var5 VARCHAR(10),var6 INT,var7 INT,var8 INT,var9 INT,var10 FLOAT,var11 FLOAT';
- my @nombres_columnas;
- my @tipos_columnas;
- for my $campo ( split /\s*,\s*/, $cabecera ) {
- my($columna, $tipo) = split " ", $campo;
- push @nombres_columnas, $columna;
- push @tipos_columnas, $tipo;
- }
- use Data::Dumper;
- print Dumper \@nombres_columnas;
- print Dumper \@tipos_columnas;
- __END__
- $VAR1 = [
- 'var1',
- 'var2',
- 'var3',
- 'var4',
- 'var5',
- 'var6',
- 'var7',
- 'var8',
- 'var9',
- 'var10',
- 'var11'
- ];
- $VAR1 = [
- 'INT',
- 'INT',
- 'INT',
- 'VARCHAR(10)',
- 'VARCHAR(10)',
- 'INT',
- 'INT',
- 'INT',
- 'INT',
- 'FLOAT',
- 'FLOAT'
- ];
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
En el primer split() indicamos que los separadores son comas con, opcionalmente, espacio en blanco a los lados.
Aunque también se puede realizar con expresiones regulares, claro, ya que se trata de un patrón con una cierta regularidad:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use strict;
- use warnings;
- use diagnostics;
- my $cabecera = 'var1 INT,var2 INT,var3 INT,var4 VARCHAR(10),var5 VARCHAR(10),var6 INT,var7 INT,var8 INT,var9 INT,var10 FLOAT,var11 FLOAT';
- my @nombres_columnas;
- my @tipos_columnas;
- while ( $cabecera =~ /(\w+)\s+([^,]+)/g ) {
- my($columna, $tipo) = ($1, $2);
- push @nombres_columnas, $columna;
- push @tipos_columnas, $tipo;
- }
- use Data::Dumper;
- print Dumper \@nombres_columnas;
- print Dumper \@tipos_columnas;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Con $cabecera =~ /(\w+)\s+([^,]+)/g, estamos buscando en $cabecera, de forma repetida (/g), una palabra, que guardamos en $1 ((\w+)) separada por uno o más espacios (\s+), y una segunda captura de cualquier cosa que no sea una coma ([^,]+).
De esa forma, capturamos las dos partes: el nombre de columna y su tipo, que almacenaremos en arrays (bueno, podríamos guardarlo en otro tipo de estructura de datos).
Desde luego, es más claro el split().