Tengo un problema para poder filtrar por llaves de un hash, espero poder expresar bien mi duda.
Estos son los datos del archivo alumnos.dat (IDSALON, IDGRADO, IDALUMNO, NOLISTA, NOMBRE)
[listbc]1=A=6=14=Juan Perez
1=B=12=9=Carlos Buenrostro
1=C=24=33=Maria de las Nieves
2=A=19=22=Adalberto Madero
2=B=31=14=Maria Felix
3=A=27=11=Guadalupe Victoria[/list:ubc]
y este es el código en Perl
Using perl Syntax Highlighting
#!/usr/bin/perl -w
#
use strict;
use Lib::DB::DBFile;
use Lib::DB::DBConnect;
my(%filtalumnos,%db_data,@alumnos,$alumnos, $dbh,$sth);
my $DBFile = new Lib::DBFile::DBFile;
my $qry = qq/select IDSALON, IDGRADO, IDALUMNO, NOLISTA, NOMBRE from ALUMNOS/;
@alumnos = $DBFile->dbopen("alumnos.dat");
$dbh = DBConnect->connect();
$sth = $dbh->prepare($qry) or die("No se puede preparar: $qry" . $dbh->errstr);
$sth->execute() or die("No se puede ejecutar: $qry" . $sth->errstr);
chomp @alumnos;
%db_data = map {$_->[0].@$_[2], join("=", @$_)}
@{$dbh->selectall_arrayref($qry)};
$sth = $dbh->prepare($qry) or die("No se puede preparar: $qry" . $dbh->errstr);
$sth->execute() or die("No se puede ejecutar: $qry" . $sth->errstr);
foreach $alumnos (@alumnos){
my @data=split(/=/,$alumnos,-1);
}
exit(0);
#
use strict;
use Lib::DB::DBFile;
use Lib::DB::DBConnect;
my(%filtalumnos,%db_data,@alumnos,$alumnos, $dbh,$sth);
my $DBFile = new Lib::DBFile::DBFile;
my $qry = qq/select IDSALON, IDGRADO, IDALUMNO, NOLISTA, NOMBRE from ALUMNOS/;
@alumnos = $DBFile->dbopen("alumnos.dat");
$dbh = DBConnect->connect();
$sth = $dbh->prepare($qry) or die("No se puede preparar: $qry" . $dbh->errstr);
$sth->execute() or die("No se puede ejecutar: $qry" . $sth->errstr);
chomp @alumnos;
%db_data = map {$_->[0].@$_[2], join("=", @$_)}
@{$dbh->selectall_arrayref($qry)};
$sth = $dbh->prepare($qry) or die("No se puede preparar: $qry" . $dbh->errstr);
$sth->execute() or die("No se puede ejecutar: $qry" . $sth->errstr);
foreach $alumnos (@alumnos){
my @data=split(/=/,$alumnos,-1);
}
exit(0);
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
Ahora explico el script.
1.- Se crea una variable @alumnos con los registros del archivo alumnos.
2.- Se obtienen todos los registro de la DB de los alumnos.
3.- Se crea un hash %db_data usando como llave el IDSALON y IDALUMNO
4.- Se validan los alumnos del archivo dentro del foreach.
En este último punto es donde no sé cómo crear un filtro del HASH, es decir, al leer el primer registro puedo determinar que el IDSALON es igual a 1 pero quiero filtrar el hash %db_data y crear un nuevo hash %filtalumnos donde estén solamente las llaves que tengan IDSALON = 1 independientemente del IDALUMNO.
Una vez filtrado si el alumno está en el nuevo hash filtrado será borrado
Using perl Syntax Highlighting
Al continuar con el foreach en el registro 4 el IDSALON cambia a 2 y los alumnos que estén el hash filtrado son los que no están en clase así que se marcan con falta.
Y se repite el proceso para el IDSALON = 2.
Espero haberme explicado bien en cuanto al problema que tengo y que me puedan ayudar a solucionarlo.
Saludos y Gracias.