$VAR1 = [
'830974',
'722065',
'722046',
'716963'
];
Jak mogę obliczyć indeks tablicy dla wartości „722065”?W Perlu, w jaki sposób mogę znaleźć indeks danej wartości w tablicy?
$VAR1 = [
'830974',
'722065',
'722046',
'716963'
];
Jak mogę obliczyć indeks tablicy dla wartości „722065”?W Perlu, w jaki sposób mogę znaleźć indeks danej wartości w tablicy?
firstidx
funkcja z List::MoreUtils może pomóc:
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
Lubię korzystać z Listy :: WięcejZadania, dobra odpowiedź! – chollida
Korzystanie porównanie numeryczne z ciągów znaków nie jest dobrym pomysłem (chociaż to nie ma znaczenia w tym przypadku. Co się dzieje, gdy masz kody pocztowe i '07030' na liście.' Perl -e „print 0 + (07030 == "07030") "' –
@Sanan: masz rację. Edytowałem swoją odpowiedź, aby wykonać porównanie ciągów. – toolic
Tutaj się pośpiesznie napisane próbę odwrotny look-up przy użyciu skrótu.
my $VAR1 = [ '830974', '722065', '722046', '716963' ];
my %reverse;
$reverse{$VAR1->[$_]} = $_ for 0 .. @$VAR1 - 1;
print $reverse{722065};
Nie uwzględnia to tablic z duplikatami wartości. Nie popieram tego rozwiązania dla kodu produkcyjnego.
W przypadku zduplikowanych wartości otrzymasz pierwszy dopasowany element. Może to być bardzo przydatne, jeśli długo żywa tablica jest sprawdzana więcej niż raz. –
Nie jestem pewien, czy rozumiem powyższy komentarz, ale sposób zapisania kodu, w przypadku zduplikowanych wartości, wygrywa najwyższy indeks. –
Zapoznaj się dyskusja na perlmonks: http://www.perlmonks.org/?node_id=66003
Należy pamiętać, że jest to link do konkursu ** golf **. Podczas gdy strona z linkami przedstawia różne algorytmy i techniki o znacznej wartości pedagogicznej, należy zachować ostrożność przy dostosowywaniu tego kodu do użytku produkcyjnego. Pamiętaj, że ** golf ** jest oceniany głównie na podstawie najmniejszej liczby znaków - nie jest to dobry sposób na przemyślenie swojego kodu produkcyjnego. – daotoad
Zapoznaj się z Perl FAQ
Wszyscy powinni przeczytać listę często zadawanych pytań przynajmniej raz w roku. –
RRTFM-ing (Ponowne czytanie dobrej instrukcji) jest niezwykle satysfakcjonującym doświadczeniem. Po raz pierwszy przeczytałem dokumenty, wiele z nich poszło mi prosto w głowę. Każde kolejne czytanie ujawniło nowe znaczenie. To niesamowite, ile rzeczy możesz się nauczyć przez (ponowne) przeczytanie instrukcji! – daotoad
Byłbym usatysfakcjonowany, gdyby większość ludzi przynajmniej raz to przeczytała. Ludzie ciągle pytają, jak istotne są najczęściej zadawane pytania, a StackOverflow był wspaniałym naturalnym eksperymentem: każdy ponownie zadaje pytania FAQ. –
Oto w jaki sposób można znaleźć wszystkie pozycje, w których pojawia się dana wartość:
#!/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";
Jeśli potrzebne jest tylko pierwszy indeks, należy użyć List::MoreUtils::first_index.
Szczerze. Stracić wzmiankę o $ [. Jest to niejasne, przestarzałe IIRC i nie ma żadnego uczciwego powodu, aby go używać. – tsee
@Zobaczyć Ci rację. Głupio było mi nawet wspomnieć o '$ [. –
To materiał z Perl Street cred, pomyślałem :-) –
to jest w porządku, każdy był nowy w perl w jednym punkcie
$ a jest elementem wydrukować indeks w @list ...
my @list = (124124, 323, 156666, 124412, 3333, 4444444444, 124124124, 24412);
my $a = 4444444444;
print
substr($_=($,=
chr($==39)).(
join$,,@list).$,,$=-$=,
index$_,$,.$a.$,)=~
tr/'//+$=---$=;
Błąd off-by-one? Wydaje "6", ale spodziewam się "5". – toolic
Jeśli Twoim celem jest pomoc początkującym, nie powinieneś publikować zaciemnionego kodu. Jeśli Twoim celem jest zaimponowanie ludziom, możesz poprawnie napisać Perl. –
@toolic: jest to 6 element listy, nie zacząłem od 0, jeśli chcesz zacząć od 0, musisz zmienić ostatnią linię na tr/'// + $ = - $ =; – John
Jeśli tylko trzeba spojrzeć w górę jeden przedmiot, użyj firstidx
, jak powiedzieli inni.
Jeśli trzeba zrobić wiele wyszukiwań, budowania indeksu.
Jeśli elementy tablicy są wyjątkowe, budowania indeksu jest dość prosta. Ale nie jest trudniej zbudować taki, który obsługuje duplikaty przedmiotów. Przykłady zarówno wykonaj:
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;
użyciu List::Util
, który jest moduł podstawowy, w przeciwieństwie List::MoreUtils
, który nie jest:
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;
używać strict; use Data :: Dumper; sub lustro { \t my $ i = 0; \t mapa {$ i ++ => \ $ _} @ {shift @_}; } my @a = ("a", "b", "c", "d", "e"); my% b = mirror \ @a; print Dumper @a; print Dumper% b; $ a [1] = 'whoa ...'; print Dumper @a; print Dumper% b; $ a [3] = 'IKNOWRIGHT!'; print Dumper @a; print Dumper% b; – user549325
Wystarczy spojrzeć na nią z pętli for. Co jeśli w tablicy są dwie wartości, które są równe? –
Czy próbowałeś w ogóle czegoś? Czy to zadanie domowe? – jsoverson
@jsoverson: Jestem nowy w Perl. Projekt samokształcenia. –