matrices - push perl
En Perl, ¿cómo puedo encontrar el índice de un valor dado en una matriz? (9)
A continuación, le mostramos cómo encontraría todas las posiciones en las que aparece un valor determinado:
#!/usr/bin/perl
use strict;
use warnings;
my @x = ( 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1 );
my @i = grep { $x[$_] == 3 } 0 .. $#x;
print "@i/n";
Si solo necesita el primer índice, debe usar List :: MoreUtils :: first_index .
$VAR1 = [
''830974'',
''722065'',
''722046'',
''716963''
];
¿Cómo puedo calcular el índice de matriz para el valor "722065"?
Aquí está el intento escrito apresuradamente en una búsqueda inversa usando un hash.
my $VAR1 = [ ''830974'', ''722065'', ''722046'', ''716963'' ];
my %reverse;
$reverse{$VAR1->[$_]} = $_ for 0 .. @$VAR1 - 1;
print $reverse{722065};
Esto no tiene en cuenta las matrices con valores duplicados. No apruebo esta solución para el código de producción.
La función firstidx
de List :: MoreUtils puede ayudar:
use strict;
use warnings;
use List::MoreUtils qw(firstidx);
my @nums = ( ''830974'', ''722065'', ''722046'', ''716963'' );
printf "item with index %i in list is 722065/n", firstidx { $_ eq ''722065'' } @nums;
__END__
item with index 1 in list is 722065
Mira la discusión sobre perlmonks: http://www.perlmonks.org/?node_id=66003
Si solo necesita buscar un elemento, use firstidx
como lo han dicho otros.
Si necesita hacer muchas búsquedas, cree un índice.
Si los elementos de su matriz son únicos, crear un índice es bastante simple. Pero no es mucho más difícil crear uno que maneje elementos duplicados. Los ejemplos de ambos siguen:
use strict;
use warnings;
use Data::Dumper;
# Index an array with unique elements.
my @var_uniq = qw( 830974 722065 722046 716963 );
my %index_uniq = map { $var_uniq[$_] => $_ } 0..$#var_uniq;
# You could use hash slice assinment instead of map:
# my %index_uniq;
# @index_uniq{ @var_uniq } = 0..$#var_uniq
my $uniq_index_of_722065 = $index_uniq{722065};
print "Uniq 72665 at: $uniq_index_of_722065/n";
print Dumper /%index_uniq;
# Index an array with repeated elements.
my @var_dupes = qw( 830974 722065 830974 830974 722046 716963 722065 );
my %index_dupes;
for( 0..$#var_dupes ) {
my $item = $var_dupes[$_];
# have item in index?
if( $index_dupes{$item} ) {
# Add to array of indexes
push @{$index_dupes{$item}}, $_;
}
else {
# Add array ref with index to hash.
$index_dupes{$item} = [$_];
}
}
# Dereference array ref for assignment:
my @dupe_indexes_of_722065 = @{ $index_dupes{722065} };
print "Dupes 722065 at: @dupe_indexes_of_722065/n";
print Dumper /%index_dupes;
echa un vistazo a las preguntas frecuentes de Perl
está bien, todos eran nuevos en Perl en un punto
$ a es el elemento para imprimir el índice de en @list ...
my @list = (124124, 323, 156666, 124412, 3333, 4444444444, 124124124, 24412);
my $a = 4444444444;
print
substr($_=($,=
chr($==39)).(
join$,,@list).$,,$=-$=,
index$_,$,.$a.$,)=~
tr/''//+$=---$=;
utilizando List::Util
, que es un módulo principal, a diferencia de List::MoreUtils
, que no es:
use List::Util qw(first);
my @nums = ( ''830974'', ''722065'', ''722046'', ''716963'' );
my $index = first { $nums[$_] eq ''722065'' } 0..$#nums;
use strict;
use Data::Dumper;
sub invert
{
my $i=0;
map { $i++ => $_ } @_;
}
my @a = (''a'',''b'',''c'',''d'',''e'');
print Dumper @a;
print Dumper invert @a;