arrays - La copia de los elementos del conjunto de hashes
perl copy (3)
Mi conjunto de hashes:
@cur = [
{
''A'' => ''9872'',
''B'' => ''1111''
},
{
''A'' => ''9871'',
''B'' => ''1111''
}
];
Resultado Esperado:
@curnew = (''9872'', ''9871'');
Cualquier forma simple de obtener solo los valores del primer elemento hash
esto y asignarlo a una matriz?
En primer lugar, su matriz debe definirse como
my @cur = (
{
''A'' => ''9872'',
''B'' => ''1111''
},
{
''A'' => ''9871'',
''B'' => ''1111''
}
);
Tenga en cuenta el paréntesis
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dump qw(dump);
my @cur = (
{
''A'' => ''9872'',
''B'' => ''1111''
},
{
''A'' => ''9871'',
''B'' => ''1111''
}
);
my @new;
foreach(@cur){
push @new, $_->{A};
}
dump @new;
Tenga en cuenta que los hashes están desordenados, por lo que primero tomo la palabra para significar lexicográficamente primero .
map { # iterate over the list of hashrefs
$_->{ # access the value of the hashref
(sort keys $_)[0] # … whose key is the first one when sorted
}
}
@{ # deref the arrayref into a list of hashrefs
$cur[0] # first/only arrayref (???)
}
La expresión devuelve qw(9872 9871)
.
Asignar un arrayref a un array como en @cur = […]
es probablemente un error, pero lo tomé al @cur = […]
de la @cur = […]
.
Solución de bonificación perl5i :
use perl5i::2;
$cur[0]->map(sub {
$_->{ $_->keys->sort->at(0) }
})->flatten;
La expresión devuelve los mismos valores que arriba. Este código es un poco más largo, pero IMO es más legible porque el flujo de ejecución va estrictamente de arriba a abajo, de izquierda a derecha.
use Data::Dumper;
my @hashes = map (@{$_}, map ($_, $cur[0]));
my @result = map ($_->{''A''} , @hashes);
print Dumper /@result;