• Publicidad

Funcionamiento de map

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Funcionamiento de map

Notapor danimera » 2012-07-12 14:41 @653

Resulta que no tengo el dato que espero...

Traigo los registros de una base de datos, y quiero en una sola línea crearle un campo a cada registro con los datos del creador del registro de otra tabla, eso por medio de un ORM:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$_->{'created_by'}  = 1 # para todos los registros que traigo
$_->{'edited_by'}   = 3 # para todos los registros
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


mi línea map es así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
map( %{$_}->{'creador'} = $usuario->retrieve( $_->{'created_by'} ) , @$contents);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


también hice esto para ver:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
map( %{$_}->{'creador_'.$_->{'created_by'}} = $usuario->retrieve( $_->{'created_by'} ) , @$contents);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y efectivamente se crea la variable {'creador_1'}.

Pero $usuario->retrieve( $_->{'created_by'} ) es donde está el problema: siempre me toma el valor 3, y digamos en mi ejemplo el creador es el 1, pero no me trae los datos del 1, si no los datos de quien lo está editando cuyo id es 3.

Un dumper me muestra algo como esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. 'creador_1' => bless(
  2.     {   'primary_key' => 'user_id',
  3.         'fields'      => [ 'user_id', 'username', 'password', 'email', 'creation_date', 'group_id', 'status' ],
  4.         'db_type'     => 'CSV',
  5.         'belongs_to'  => {},
  6.         'table'       => 'user',
  7.         'dbh'  => bless( {}, 'DBI::db' ),
  8.         'data' => {
  9.             'email'         => '[email protected]',
  10.             'password'      => '1111',
  11.             'group_id'      => '2',
  12.             'creation_date' => '2012-6-14',
  13.             'status'        => undef,
  14.             'user_id'       => '3',
  15.             'username'      => 'talabary'
  16.         },
  17.         'has_many' => { 'group' => { 'MyApp::Db::Group' => 'group_id' } }
  18.     },
  19.     'MyApp::Db::User'
  20.     ),
  21.     'date_creation' => '2012-7-9',
  22.     'target'        => '',
  23.     'edited_by'     => '3',
  24.     'template'      => 'template.html',
  25.     'lastest_edit'  => '2012-7-9',
  26.     'show_in_menu'  => '',
  27.     'image'         => '',
  28.     'tags'          => '',
  29.     'title'         => 'Terminos y Condiciones',
  30.     'decription'    => '',
  31.     'created_by'    => '1'
  32.  };
  33.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


pero lo que yo espero es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. 'creador_1' => bless(
  2.     {   'primary_key' => 'user_id',
  3.         'fields'      => [ 'user_id', 'username', 'password', 'email', 'creation_date', 'group_id', 'status' ],
  4.         'db_type'     => 'CSV',
  5.         'belongs_to'  => {},
  6.         'table'       => 'user',
  7.         'dbh'  => bless( {}, 'DBI::db' ),
  8.         'data' => {
  9.             'email'         => '[email protected]',
  10.             'password'      => '2222',
  11.             'group_id'      => '1',
  12.             'creation_date' => '2012-6-14',
  13.             'status'        => undef,
  14.             'user_id'       => '1',
  15.             'username'      => 'danimera'
  16.         },
  17.         'has_many' => { 'group' => { 'MyApp::Db::Group' => 'group_id' } }
  18.     },
  19.     'MyApp::Db::User'
  20.     ),
  21.     'date_creation' => '2012-7-9',
  22.     'target'        => '',
  23.     'edited_by'     => '3',
  24.     'template'      => 'template.html',
  25.     'lastest_edit'  => '2012-7-9',
  26.     'show_in_menu'  => '',
  27.     'image'         => '',
  28.     'tags'          => '',
  29.     'title'         => 'Terminos y Condiciones',
  30.     'decription'    => '',
  31.     'created_by'    => '1'
  32.     };
  33.  
  34.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


No sé si el problema está en $usuario->retrieve( $_->{'created_by'} ), pero ese método funciona bien solo si la cargo así:

my $usuario = MyApp::Db::User->new($dbh);

y el método retrieve() devuelve la consulta de la tabla de usuarios con los datos.
Última edición por explorer el 2012-07-12 16:27 @727, editado 3 veces en total
Razón: Formateado de código con Perltidy
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Re: Funcionamiento de map

Notapor explorer » 2012-07-12 16:40 @736

No me gusta nada esto: %{$_} ¿qué contiene $_ en ese momento? Según el código, es cada uno de los elementos de @$contents, pero, ¿qué tipo de dato es?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Funcionamiento de map

Notapor danimera » 2012-07-12 16:45 @739

explorer escribiste:No me gusta nada esto: %{$_} ¿qué contiene $_ en ese momento? Según el código, es cada uno de los elementos de @$contents, pero, ¿qué tipo de dato es?


Perdón, se me fue ese % que no te gusta.

Así es :
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. map( {$_}->{'creador_'.$_->{'created_by'}} = $usuario->retrieve( $_->{'created_by'} ) , @$contents);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y ese $contents es un resultado de una consulta :
Sintáxis: [ Descargar ] [ Ocultar ]
  1. my $query = "SELECT * FROM $table_name"; 
  2. return $sth->fetchall_arrayref({});  


$_ yo creo que debe contener el contenido de la posición del array en ese momento.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Funcionamiento de map

Notapor explorer » 2012-07-13 04:13 @217

A ver, a ver...

El resultado de la consulta es una referencia a un array. Ese valor se supone que está dentro de $contents.

Luego entonces @$contents devuelve una lista con los valores del array referenciado. Como se le ha pasado una referencia a un hash vacío dentro de fetchall_arrayref(), entonces lo que estás haciendo es en realidad llamar a fetchrow_hashref() dentro de un bucle por cada fila del resultado. Cada elemento del array, entonces, guarda una referencia a un hash, con los campos de cada columna de cada fila del resultado.

Entonces, $_ dentro del map() guarda una referencia a un hash. Entonces... sobran las llaves completamente:

map( $_->{'creador_'.$_->{'created_by'}} = $usuario->retrieve( $_->{'created_by'} ) , @$contents);

Quizás te quede más claro si lo haces con un for():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my fila (@$contents) {
  2.     my $creado_por = $_->{'created_by'};
  3.     my $usuario_rt = $usuario->retrieve( $creado_por );
  4.     my $usuario_nw = "creador_$creado_por";
  5.     $_->{ $usuario_nw } = $usuario_rt;
  6. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esta manera, puedes, además, colocar print() o say() dentro del código para ver qué está haciendo. Y una vez que lo tengas funcionando, si quieres, lo pasas a forma de map(). O lo dejas como bucle.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Funcionamiento de map

Notapor danimera » 2012-07-13 13:43 @613

No, nada, con el for() sí que menos, pues esta vez no me creerá la referencia para tener los datos del creador...

Mi pregunta para el map es:

map( $_->{'creador_'.$_->{'created_by'}} = $usuario->retrieve( $_->{'created_by'} ) , @$contents);

$_->{'created_by'} en rojo: ahí sí vale 1, pero $_->{'created_by'} al parecer vale hice un die() dentro de la función $usuario->retrieve y pude ver que el valor que esta tomando es 1, hice el die Dumper dentro de esta función y efectivamente me retorna el valor esperado: el creador son los datos del id 1...

Pero cuando hago el Dumper de $contents todos los registros me han creado un referencia ->{'creador_'1} pero con los datos del editor en ese momento y no con el creador, en estos casos que pruebo me trae los datos del usuario con id 3. :S. ¡OJO!: Eso es solo cuando yo pongo $_->{'created_by'} que supuestamente vale 1, si pongo el 1 en vez de la variable todo funciona normal...

El map() no funciona como yo esperaba...
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Funcionamiento de map

Notapor explorer » 2012-07-13 14:41 @653

El for() que te he puesto hace las mismas operaciones que el map(), solo que en varias líneas, con lo que es más fácil de depurar, incluso con el depurador integrado de Perl.

Esa es otra posibilidad: ejecutarlo paso a paso para ver qué hace.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Funcionamiento de map

Notapor danimera » 2012-07-13 14:51 @660

Pero lo más raro es que de esa forma no me crea la referencia {'creador'}, es decir el Dumper no me trae los datos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     for my $fila (@$contents) {
  2.  
  3.     my $creado_por = $_->{'created_by'};
  4.     my $usuario_rt = $usuario->retrieve( $creado_por );
  5.     my $usuario_nw = "creador";
  6.     $_->{ 'creador' } = $usuario_rt;
  7.  
  8.     }
  9.  
  10.    return Dumper  $contents;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Funcionamiento de map

Notapor explorer » 2012-07-13 14:54 @662

Disculpa. Este es el correcto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for (@$contents) {
  2.     my $creado_por = $_->{'created_by'};
  3.     my $usuario_rt = $usuario->retrieve( $creado_por );
  4.     my $usuario_nw = "creador_$creado_por";
  5.     $_->{ $usuario_nw } = $usuario_rt;
  6. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Funcionamiento de map

Notapor danimera » 2012-07-13 15:01 @668

Y ahora tenemos lo mismo:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. 'creador_1' => bless( { 'primary_key' => 'user_id', 'fields' => [ 'user_id', 'username', 'password', 'email', 'creation_date', 'group_id', 'status' ], 'db_type' => 'CSV', 'belongs_to' => {}, 'table' => 'user', 'dbh' => bless( {}, 'DBI::db' ), 'data' => { 'email' => '[email protected]', 'password' => 'tabary', 'group_id' => '2', 'creation_date' => '2012-6-14', 'status' => undef, 'user_id' => '3', 'username' => 'talabary' } 


el user_id es el 1, :( y me trae los datos del 3...

hice un die Dumper dentro del for y tengo esto:


Sintáxis: [ Descargar ] [ Ocultar ]
  1. $VAR1 = bless( { 'primary_key' => 'user_id', 'fields' => [ 'user_id', 'username', 'password', 'email', 'creation_date', 'group_id', 'status' ], 'db_type' => 'CSV', 'belongs_to' => {}, 'table' => 'user', 'dbh' => bless( {}, 'DBI::db' ), 'data' => { 'email' => '[email protected]', 'password' => 'adn', 'group_id' => '1', 'creation_date' => '2012-5-15', 'status' => '1', 'user_id' => '1', 'username' => 'admin' }, 'has_many' => { 'group' => { 'MyApp::Db::Group' => 'group_id' } } }, 'MyApp::Db::User' );  


y este es el resultado que espero :S :cry:
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Funcionamiento de map

Notapor explorer » 2012-07-13 17:25 @767

Pero, ¿en qué momento hiciste el Dumper, y de qué?

Dices que el resultado del Dumper es correcto, pero ¿es justo después del receive()?

¿Y si haces un Dumper de $_->{ $usuario_nw } justo después de la asignación, para ver qué contiene?

Podría ser que siempre estés almacenando los valores en el mismo sitio...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados