Esto es lo que he hecho:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
my %hash = (
'2hbsA' =>
{
97 => 0.196,
98 => 0.126,
99 => 0.131,
},
'2hbsB' =>
{
10 => 0.191,
},
'2hipA' =>
{
10 => 0.281,
11 => 0.274,
},
'2j9uB' =>
{
123 => 0.102,
124 => 0.199,
},
);
my %hfiredb = (
'2hbsA' =>
{
97 => 1,
98 => 1,
},
'2j9uB' =>
{
123 => 1,
},
);
my %hanolea = (
'2hbsA' =>
{
97 => -3.769,
98 => -5.233,
99 => -6.971,
},
'2hbsB' =>
{
10 => -5.591,
},
'2hipA' =>
{
10 => -12.156,
11 => -13.044,
},
'2j9uB' =>
{
123 => -4.653,
124 => -3.102,
},
);
my $intervi = 0;
my $count_fdb = 0;
my $rango_fl = $ARGV[0];
my $rango_an = $ARGV[1];
for my $x (sort keys %hash) {
for my $y (sort keys %{$hash{$x}}) {
# esto imprime los valores que coloque anteriormente
#print "$x\t$y\t$hash{$x}{$y}\t$hfiredb{$x}{$y}\t$hanolea{$x}{$y}\n";
my $valor_fl = $hash {$x}{$y};
my $valor_an = $hanolea{$x}{$y};
my $valor_fdb = $hfiredb{$x}{$y} || 0;
for my $i ( 0 .. 7 ) {
for my $j ( -3 .. 3 ) {
my $min_fl = $i * $rango_fl;
my $max_fl = $min_fl + $rango_fl;
my $min_an = $j * $rango_an;
my $max_an = $min_an + $rango_an;
#print "Analizando [$min_fl,$max_fl) => $valor_fl : [$min_an,$max_an) => $valor_an\n";
if (
$valor_fl >= $min_fl and
$valor_fl < $max_fl and
$valor_an >= $min_an and
$valor_an < $max_an
) {
$intervi++;
$count_fdb++ if $valor_fdb == 1;
}
}}
}
print "$intervi\t$count_fdb\n";
}
__END__
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Lo que difiere con tu programa es lo siguiente.
He eliminado la variable $intervii porque no veo en el ejemplo ningún sitio donde se use.
En las líneas 66 y 67 se leen los rangos pasados por el usuario.
En la línea 79 inicializamos los valores desde los
hash, salvo que %hfiredb no podría tener valor, por lo que, en ese caso, le ponemos un valor 0 (distinto del valor 1 que es el que nos interesa buscar).
De la 81 a la 101 está el doble bucle de 8x8 rangos, donde vamos variando los intervalos de búsqueda, que construimos en las líneas 84 a 87.
En la 91, hacemos la pregunta de si los valores que tenemos está dentro del intervalo, e incrementamos los contadores.
Con los datos introducidos, con
Using bash Syntax Highlighting
.
/programa.pl
0.7 2.5Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
me da
Using text Syntax Highlighting
3 2
4 2
4 2
6 3
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Nota: hay que tener en cuenta a la hora de hacer la comparación de los intervalos, qué parte, si la derecha o la izquierda, forma parte de la comparación. En el código, he puesto la parte izquierda (el valor menor del intervalo pertenece al intervalo). De ahí la diferencia de usar '[' y ')' como se indica en el print() comentado.
(Un poco de matemáticas).