arrays - funciones - recorrer array asociativo php
Perl, Un hash de matrices: agregar y eliminar claves, agregar a una matriz, todo en un ciclo while (2)
En realidad, estás muy cerca, algunas notas:
En su bloque
else
, asigne una referencia a@q
en su hash e inmediatamente sobreescriba con[$seq]
, solo se mantendrá la última operación en el hash.No necesita el
next
al final de su ciclo, irá automáticamente a la siguiente iteración si ya no hay más sentencias para ejecutar en el cuerpo del ciclo.
Todo lo demás parece funcionar bien, aquí están mis revisiones y los datos de prueba que utilicé (ya que no sé nada sobre secuencias de ADN, solo utilicé letras que recuerdo de la biología de la escuela secundaria)
Fichero de entrada:
A 1
T 2
G 3
A 3
A 2
G 5
C 1
C 1
C 2
T 4
Código:
use strict;
use warnings FATAL => ''all'';
# open file for reading
open(my $fh, ''<'', ''test.txt'');
my %hash;
while ( my $line = <$fh> ) { # read a line
# split the line read from a file into a sequence name and value
my ($q, $seq) = split(//s+/, $line);
if( exists $hash{$q} ) {
push @{ $hash{$q} }, $seq;
}
else {
$hash{$q} = [$seq];
}
}
# print the resulting hash
for my $k ( keys %hash ) {
print "$k : ", join('', '', @{$hash{$k}}), "/n";
}
# prints
# A : 1, 3, 2
# T : 2, 4
# C : 1, 1, 2
# G : 3, 5
Tengo un hash que debe contener ciertas claves que están vinculadas a sus propias matrices. Para ser más específicos, las claves hash son valores de calidad y las matrices son nombres de secuencia. Si ya hay una matriz para esa calidad, me gustaría agregar el nombre de la secuencia a la matriz que está vinculada a la calidad en cuestión. Si no hay uno, quiero crear uno y agregarle el nombre de la secuencia. Todo esto se hace en un ciclo while, pasando por todas las secuencias una por una.
He intentado hacer cosas como Perl. ¿Cómo recupero una matriz de un hash de matrices? pero parece que no puedo hacerlo bien.
Acabo de recibir estos mensajes de error: Valor escalar @ {hash {$ q} mejor escrito como $ {hash {$ q} en la línea asdasd.pl 69. El símbolo global "@q" requiere el nombre explícito del paquete asdasd.pl línea 58. Y algunos otros, también.
Aquí hay un ejemplo de lo que he intentado:
my %hash;
while (reading the sequences) {
my $q = "the value the sequence has";
my $seq = "the name of the sequence";
if (exists $hash{$q}) {
push (@{$hash{$q}}, $seq);
} else {
$hash{$q} = /@q;
$hash{$q} = [$seq];
next;
}
}
Obviamente, este no debería ser un problema muy complicado, pero soy nuevo en Perl y este tipo de problema parece difícil. Lo busqué en Google desde varios lugares, pero parece que hay algo de lo que no me doy cuenta, y puede ser realmente obvio también.
Puedes usar lo que Perl llama autovigilancia para hacer esto bastante fácil. Su código no necesita esa instrucción if central. Puedes reducirlo a:
push @{ $hash{$q} }, $seq;
Si la clave particular aún no existe en el hash, perl lo autoextrañará, ya que puede inferir que usted quería una referencia de matriz aquí.
Puede encontrar más recursos sobre la autovibición buscando en Google. Es una palabra lo suficientemente única como para que la gran mayoría de los éxitos parezcan relevantes. :-)