Jak przejść na tablicy w Perl

Zadanie. W kodzie programu Perl jest tablica @arr (trzy pierwsze litery od słów "array"). W tej tablicy są jakieś wartości. Trzeba przejść przez wszystkie elementy tablicy i wykonać jakieś czynności z każdym elementem.

Chodzić na tablicy za pomocą foreach

Zalecany sposób rozwiązania tego zadania to wykorzystać foreach. Oto przykład programu:

▶ Run
#!/usr/bin/perl

my @arr = (1, 2, 3);

foreach my $el (@arr) {
    warn $el;
}

Wszystko jest bardzo proste. Jest tablica. Dalej tworzymy zmienną $el (skrót od słowa element). Cykl foreach umieszcza się w tę zmienną pierwszy element tablicy (w naszym przykładzie jest to liczba 1). Wykonywane jest ciało pętli warn $el; — to wyświetla wartość na ekran. Cykl foreach umieszcza w zmiennej $el następującą wartość z tablicy, ponownie wykonywane jest ciało pętli. Tak powtarza się aż ciało pętli nie zostanie przeprowadzona dla wszystkich elementów tablicy.

Chodzić na tablicy za pomocą pętli for

Oto program-przykład, jak przejść przez Perl tablicy za pomocą pętli podobnego do pętli w języku C:

▶ Run
#!/usr/bin/perl

my @arr = (1, 2, 3);

for (my $i = 0; $i < @arr; $i++) {
    warn $arr[$i];
}

Co tu się dzieje. Istnieje szereg @arr. Dalej stworzyliśmy nową zmienną $i i przypisuje mu wartość 0 (0 — jest to wskaźnik pierwszy element w Perl tablicy). Dalej wykonywane jest ciało pętli warn $arr[$i];. Wtedy zmienna $i za pomocą operatora ++ zwiększa się o jeden. Następnie sprawdzane są warunki $i < @arr. Jeśli warunek zwróciło prawdę, to wtedy wszystko się powtarza.

To rozwiązanie jest nieco bardziej skomplikowana niż rozwiązanie z pomocą foreach. Trzeba delikatnie pracować z ostatecznymi wartościami. Jeśli prawidłowo napisz do sprawdzenia, to można pominąć ostatnią wartość, albo odwołać się do nieistniejącego elementu za ostatnim elementem tablicy (takie traktowanie zwróci undef).

Oto przykład programu, który działa tak samo, ale jest używany inny warunek for:

▶ Run
#!/usr/bin/perl

my @arr = (1, 2, 3);

for (my $i = 0; $i <= $#arr; $i++) {
    warn $arr[$i];
}

for tablica ma sens używać jeśli w ciele pętli nie tylko wartość przedmiotu, ale i jego numer. Ale i w tym przypadku można użyć foreach cykl, ręcznie wystawiając wartość zmiennej z indeksem:

▶ Run
#!/usr/bin/perl

my @arr = (1, 2, 3);
my $i = 0;

foreach my $el (@arr) {
    warn "index: $i value: $el";
    $i++;
}

Taka opcja łatwiej jest postrzegany przez człowieka i jest mniej podatny na bahamów z granicznym wartością. Ale istnieje bardziej wygodny w stanie powiedzieć to samo za pomocą each.

Przejść na tablicy za pomocą while i each

Słowo kluczowe each jest używany nie to, że bardzo często, ale prawie zawsze gdy jest używany, jest ona używana do pracy z хешом. Nie jest dobrze znana, ale each można użyć do tego celu przejść na tablicy, jednocześnie otrzymując indeks elementu i sam element. Oto jak wygląda poprzedni kod napisany z pomocą each:

▶ Run
#!/usr/bin/perl

my @arr = (1, 2, 3);

while (my ($i, $el) = each @arr) {
    warn "index: $i value: $el";
}

each było można stosować do macierzy począwszy od wersji Perl 5.12. Gdyby ten kod na więcej wczesnej wersji Perl, to będzie błąd:

Type of arg 1 to each must be hash (not private array) at script.pl line 5, near "@arr) "
Execution of script.pl aborted due to compilation errors.

Tematy pokrewne

Inne artykuły