Przejdź do zawartości

Perl/Tablice

Z Wikibooks, biblioteki wolnych podręczników.
Poprzedni rozdział: Zmienne skalarne
Następny rozdział: Hasze

Listy

[edytuj]

Lista w Perlu jest uporządkowanym zbiorem wartości skalarnych. W kodzie jest reprezentowany przez sekwencje wartości, oddzielonych przecinkiem. Listy mogą być używane do wielokrotnego przydzielania wartości do zmiennych za jednym razem, i mogą być wykorzystywane jako argument do kilku wbudowanych funkcji oraz funkcji stworzonych przez użytkownika:

($dlugosc, $szerokosc, $glebokosc) = (10, 20, 15);

print "Wymiary: ", $dlugosc, $szerokosc, $glebokosc, "\n";
Uwaga
Nawiasy nie są potrzebne w konstruowaniu listy. Używamy ich tylko do zapewnienia pierwszeństwa.

Alternatywna konstrukcja listy

[edytuj]

Podczas tworzenia listy z kilkoma łańcuchami znaków bez spacji, Perl dostarcza skrót, który pomija wstawianie przecinków i kropek. Zamiast

($imie1, $imie2, $imie3, $imie4) = ('Paul', 'Michael', 'Jessica', 'Megan');

Możesz użyć operatora qw//. Operator ten używa niealfanumerycznych znaków jako ogranicznik (zazwyczaj znaku / ) i ogranicza spacjami kolejne elementy. Ogranicznik oddziela polecenie od argumentów. Poniższa linia oznacza to samo, co powyższa:

 ($imie1, $imie2, $imie3, $imie4) = qw/Paul Michael Jessica Megan/;

i jest równoznaczne temu:

 ($imie1, $imie2, $imie3, $imie4) = qw(Paul Michael Jessica Megan);


Ostatni przykład używa otwierającego i zamykającego nawiasu, jako różny ogranicznik. Jeśli jest wersja otwierająca i zamykająca ogranicznik, musisz użyć obydwu. W przeciwnym przypadku powtarzasz go dwa razy, np. nie możesz napisać qw<Paul Michael<, musisz napisać to tak: qw<Paul Michael>.

Uwaga
Wynik używania operatora qw// jest podobny, jak pojedynczego cudzysłowu tzn. łańcuch znaków nie jest interpretowany. Jeśli potrzebujesz dołączyć zmienną w twojej liście, nie możesz używać tej metody.

Przypisywanie za pomocą list

[edytuj]

Jak już zobaczyliśmy, listy mogą być używane do tworzenia wielu przypisań za jednym razem. Jeśli liczba zmiennych po lewej stronie jest taka sama, jak po prawej, do wszystkich zmiennych jest przypisywana odpowiednia wartość, jak zresztą oczekiwaliśmy.

Jeśli mamy mniej zmiennych po lewej, niż po prawej, dodatkowa wartość po prostu nie jest przypisana żadnej zmiennej, ale będzie obliczona, (np. przy $x++):

($dlugosc, $szerokosc) = (10, $sz, 15);  #$dlugosc ma 10,
                                         #$szerokosc ma wartość taką samą jak $sz. 
                                         #15 jest pominięta

Jeśli mamy więcej zmiennych po lewej, niż po prawej, dodatkowa wartość będzie posiadała domyślną wartość undef:

($dlugosc, $szerokosc, $glebokosc) = (10, $w); #$dlugosc ma 10, 
                                               #$szerokosc ma wartość taką samą jak $w. 
                                               #$glebokosc wynosi undef

Przypisywanie poprzez listy umożliwia nam w łatwy sposób zamianę wartości dwóch zmiennych (ang. "swap"), bez potrzeby tworzenia dodatkowej, tymczasowej wartości:

$foo = 10;
$bar = 5;
($foo, $bar) = ($bar, $foo);  #$foo ma teraz 5, a $bar wynosi 10;

Tablice

[edytuj]

Tablica w Perlu, jest zmienną przechowującą listę. Tablica może być modyfikowana, można dodawać elementy i je usuwać, opróżniać, ponownie przypisywać do całkowicie różnych list. Podobnie jak wszystkie zmienne skalarne rozpoczynają się od znaku $, wszystkie tablice rozpoczynają się od znaku @.

Uwaga

Używanie nazwy 'lista' i 'tablica' zamiennie jest powszechnym błędem.
Lista (np. qw/foo bar baz/) ma to do tablicy (jak np. @imiona), co ma łańcuch znaków (np. 'Paul') do zmiennej skalarnej (jak np. $imie).

Przypisywanie tablicy

[edytuj]

Tablica ma przypisaną listę wartości. Lista może być zarówno duża, jak i mała (może także nie posiadać żadnej wartości).

@numery = (1,2,3,4,5);

@wiecej_numerow = 6..1000; # używanie operatora zakresu 

@pusta = ();  # pusta tablica.

@imiona = qw/Paul Michael Jessica Megan/;

@wszystko = (@numery, @wiecej_numerow);  #@wszystko przechowuje wszystkie liczby od 1 do 1000

Ostatni przykład pokazuje cechę perla znaną jako 'array flattening' (spłaszczanie tablicy). Kiedy tablica jest używana w liście, zapełnia listę elementami znajdującymi się w niej, a nie tworzy tablicę w tablicy. Jak wspomnieliśmy wcześniej, lista jest zbiorem tylko zmiennych skalarnych. Tak więc tablica @wszystko przechowuje 1000 elementów, a nie 2.

Uwaga

Chociaż daje to do zrozumienia, że nie można utworzyć 'tablicy w tablicy' lub 'dwuwymiarowej tablicy', takie coś także istnieje w Perlu. Zobacz do rozdziału o referencjach.

Tablice w kontekście skalara

[edytuj]

Kiedy tablica jest używana w kontekście skalara - zarówno kiedy przypisujemy zmienną skalarną do wartości tablicy lub używamy jej w operacji lub funkcji, która wymaga skalara - tablica zwraca swoją wielkość tzn. ile elementów aktualnie przechowuje.

@imiona = qw/Paul Michael Jessica Megan/;

$ile_imion = @imiona;
 
print "Mam $ile_imion imiona\n";


Uwaga
Powszechnym poglądem jest, że lista w kontekście skalara także zwraca swoją wielkość. Nie jest to prawdą. W rzeczywistości, kiedy używa się operatora przecinek w kontekście zmiennej skalarnej nie tworzy się listy, lecz uwzględnia się każdy argument od lewej do prawej i zwraca ostatni:

$imie = qw/Paul Michael Jessica Megan/;
print "Ostatnie imie na mojej liscie to $imie\n";

Wyświetlanie tablicy

[edytuj]

Mamy dwa sposoby pokazywania wartości, jakie są w tablicy. Możesz zarówno wyświetlać listę elementów bezpośrednio lub możesz ją wstawić w łańcuchu znaków z podwójnymi cudzysłowami.

@imiona = qw/Paul Michael Jessica Megan/;
print "Moje imiona: ", @imiona, ".\n";
print "Moje imiona: @imiona.\n";

W pierwszym przykładzie funkcja print bierze listę z 6 argumentami: napis 'Moje imiona: ', każdą z czterech wartości w @imiona i tekst ".\n". Każdy argument jest podczas wyświetlania oddzielony od siebie wartością zawartą w zmiennej $, (domyślna wartość jest pustym tekstem), w tym przykładzie wartości znajdujące się w tablicy zostaną 'zmiażdżone' razem:

Moje imiona: PaulMichaelJessicaMegan.

W drugim przykładzie funkcja print bierze bezpośrednio jeden argument: łańcuch znaków, który przechowuje zinterpolowaną tablicę. Kiedy Perl interpoluje tablice, wynikiem jest łańcuch znaków zawierający wszystkie wartości tablicy, oddzielone wartością znajdującą się w zmiennej $" (która domyślnie przechowuje pojedyńczą spację):

Moje imiona: Paul Michael Jessica Megan.
Uwaga
Zarówno zmienna $,, jak i $" mogą być zmienione na dowolny łańcuch znaków np. chcemy odzielić elementy tablicy od siebie przecinkiem
$" = ', ';
print "Moje imiona: @imiona.\n";

Moje imiona: Paul, Michael, Jessica, Megan.

Dostęp do elementów w tablicy

[edytuj]

Elementy tablicy dostępne są poprzez użycie odwołania numerycznego. Każdy element w tablicy jest zmienną skalarną i dlatego odwołując się do wartości należy użyć znaku $. Pierwszy element tablicy ma numer 0 i każdy następny ma numer o jeden większy. Ujemna liczba odnosi się do odpowiedniego elementu idącego z prawej strony tablicy. Tak więc -1 oznacza ostatni element w tablicy, a -3 trzeci od końca. Zobaczmy kilka przykładów:

@tablica = (1, 2, 3, 4, 5);
print $tablica[0]; # Pokaże 1
print $tablica[1]; # Pokaże 2
print $tablica[3]; # Pokaże 4
print $tablica[4]; # Pokaże 5

Znanym błędem jest napisanie czegoś takiego:

print @tablica[0];  # Także pokaże 1, ale jest to niepoprawne

W rzeczywistości @tablica[0] jest kawałkiem tablicy (czyli pod-tablicą w tablicy), który przechowuje jeden element. Natomiast $tablica[0] jest zmienną skalarną, która przechowuje wartość 1.

Poprzedni rozdział: Zmienne skalarne
Następny rozdział: Hasze