Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
my $deletechar = $devueltos{$row}{'smtpdiagnosticcode'} =~ s/'//g;
cuando debería ser así:
(my $deletechar = $devueltos{$row}{'smtpdiagnosticcode'}) =~ s/'//g;
Sin los paréntesis, $deletechar contiene el número de sustituciones hechas, no el texto transformado sin las comillas.
En cuanto al código, se puede simplificar bastante: hay muchas columnas que coinciden en nombre con la clave del valor a recuperar, y unas pocas excepciones a esa regla. Por ejemplo:
Using perl Syntax Highlighting
- #!/usr/bin/env perl
- use v5.14;
- use Encode;
- my @columnas = qw(
- smtpcode email smtpaction smtpstatus
- smtpdiagnosticcode smtpremotemta smtplastattempdate
- userid adminid campanaid listaid
- status
- );
- my %columnas_especiales = (
- smtpcode => 'smtpcode1',
- smtpstatus => 'smtpcode',
- smtpdiagnosticcode => 'smtpprefixdetail',
- smtpremotemta => 'smtpremote',
- smtplastattempdate => 'smtpdate',
- userid => 'id_usuario',
- adminid => 'id_admin',
- campanaid => 'id_campana',
- listaid => 'id_lista',
- );
- # Valores de prueba
- my %devueltos = (
- 1 => {
- smtpcode => 'smtpcode',
- email => 'email',
- smtpaction => 'smtpaction',
- smtpstatus => 'smtpstatus',
- smtpdiagnosticcode => "smtpdiagnosticcode \xf1", # con una "ñ" en iso-8859-1
- smtpremotemta => 'smtpremotemta',
- smtplastattempdate => 'smtplastattempdate',
- userid => 'userid',
- adminid => 'adminid',
- campanaid => 'campanaid',
- listaid => 'listaid',
- status => 'status',
- },
- );
- for my $row ( sort keys %devueltos ) {
- my @queryColumns;
- my @queryValues;
- # TODO : Líneas comentadas para rehacer las líneas siguientes
- #
- #if ( exists( $campanas{ $devueltos{$row}{'campanaid'} } ) ) {
- # $campanas{ $devueltos{$row}{'campanaid'} }{'count'}++;
- # $campanas{ $devueltos{$row}{'campanaid'} }{'adminid'} = $devueltos{$row}{'adminid'};
- #}
- #else {
- # $campanas{ $devueltos{$row}{'campanaid'} }{'count'} = 1;
- # $campanas{ $devueltos{$row}{'campanaid'} }{'adminid'} = $devueltos{$row}{'adminid'};
- #}
- for my $columna (@columnas) {
- if (defined $devueltos{$row}{$columna}) {
- my $valor = $devueltos{$row}{$columna};
- # casos especiales
- if ($columna eq 'smtpdiagnosticcode') {
- (my $valornuevo = $valor) =~ s/'//g;
- # FIXME : no es necesario decodificar en 8859-1 porque es la codificación por defecto
- #$valor = encode('utf8', decode('iso-8859-1', $valornuevo));
- $valor = encode('utf8', $valornuevo);
- }
- elsif ($columna eq 'status') {
- $valor = 'true';
- }
- # guardar columna y valor para la consulta
- my $col = $columnas_especiales{$columna} || $columna; # cambio de nombre de la columna
- push @queryColumns, $col;
- push @queryValues, qq('$valor');
- }
- }
- push @queryColumns, 'fecha';
- push @queryValues, 'now()';
- #say join ", " => @queryColumns;
- #say join ", " => @queryValues;
- my $query = "INSERT INTO ex_tbl_devueltos ("
- . join(',', @queryColumns)
- . ") VALUES ("
- . join(',', @queryValues)
- . ")"
- ;
- #say $query;
- my $sth = $dbh->prepare($query) or die "Can't prepare SQL statement: ", $dbh->errstr(), "\n";
- $sth->execute() or die "Can't execute SQL statement: ", $sth->errstr(), "\n";
- }
- __END__
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4
Este es un programa por sí solo (se puede ejecutar desde la línea de comandos). Por ello, tiene valores de prueba (líneas 24 a 40) y se han comentado líneas que no influyen en el resto (líneas 48 a 57), por lo que luego habrá que ajustar el código para ponerlo en su sitio definitivo, pero sirve para ver otra forma de resolver el problema.
La idea es tener un array con los nombres de las columnas que nos interesan (línea 5). Si esos nombres coincidiesen con los nombres de las columnas de la base de datos, no necesitaríamos más, pero como no es el caso, necesitamos un hash para que nos haga el paso de un nombre a otro (línea 12).
Luego, no vamos a ir construyendo la consulta poco a poco, agregando columnas y valores a cadenas de texto, sino en arrays (líneas 45 y 46). Así no tenemos peligro de que se nos escape alguna coma de más o de menos.
Por cada fila en %devueltos (línea 43), recorremos todas las columnas (línea 59). Si hay un valor para esa columna (línea 60), miramos que no haya que hacer una transformación especial de ese valor (líneas 63 a 73). Finalmente, guardamos columna y valor (líneas 75 a 79). Agregamos la última columna (83 y 84) y creamos la consulta a partir de los array (89 a 94). Luego la ejecutamos.
Tal cual está así, funciona igual a como estaba antes, pero con menos líneas. Lo interesante es pasar la consulta para que use "placeholder", para que sea más seguro.
Los cambios son muy pequeños:
Using perl Syntax Highlighting
- my $query = "INSERT INTO ex_tbl_devueltos ("
- . join(',', @queryColumns)
- . ") VALUES ("
- . join(',', ('?') x @queryValues)
- . ")"
- ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Using perl Syntax Highlighting
- $sth->execute(@queryValues) or die "Can't execute SQL statement: ", $sth->errstr(), "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Cambiando la línea 92 conseguimos que la consulta tenga este aspecto:
Using text Syntax Highlighting
INSERT INTO ex_tbl_devueltos (smtpcode1,email,smtpaction,smtpcode,smtpprefixdetail,smtpremote,smtpdate,id_usuario,id_admin,id_campana,id_lista,status,fecha) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)
y la línea 99 pasa todos los valores a usar. Ya no necesitamos hacer, entonces, el proceso de eliminación de las comillas.