Provided by:
manpages-pl_20060617-3_all 
NAZWA
perldata - typy danych Perla
OPIS
Nazwy zmiennych
Perl posiada trzy typy struktur danych: skalary, tablice skalarow oraz
asocjacyjne tablice skalarow, zwane te "haszami" ("hashes"). Zwykle
tablice indeksowane s liczbami, poczwszy od 0 (indeksy ujemne s liczone
od koca tablicy). Tablice asocjacyjne indeksowane s lacuchami.
Wartoci s zwykle przypisane do nazwy (lub nazwanego odwolania).
Pierwszy znak nazwy mowi o tym, do jakiego rodzaju struktury danych si
ona odnosi. Reszta nazwy okrela konkretn warto, do ktorej odnosi si
nazwa. Najczciej sklada si ona z pojedynczego identyfikatora, to
znaczy, lacucha rozpoczynajcego si liter lub znakiem podkrelenia i
zawierajcego litery, podkrelenia i cyfry. W niektorych przypadkach moe
by cigiem identyfikatorow, rozdzielonych przez :: (lub przez ', ale nie
jest to polecane). Wszystkie oprocz ostatniego interpretowane s jako
nazwy pakietow, wskazujc przestrzenie nazw, w ktorych bdzie wyszukiwany
ostatni identyfikator (szczegoly znajdziesz w sekcji Packages
podrcznika perlmod(1)). Moliwe jest zastpienie prostego identyfikatora
wyraeniem, ktore w czasie wykonania tworzy odwolanie do wartoci; jest
to opisane szczegolowo poniej oraz na stronie perlref(1) podrcznika.
Istniej rownie zmienne specjalne, ktorych nazwy nie przestrzegaj
powyszych regul, po to by nie kolidowaly przypadkowo z ktor z twych
zwyklych zmiennych. Lacuchy, ktore pasuj do objtych nawiasami okrglymi
czci wyraenia regularnego zachowywane s pod nazwami zawierajcymi tylko
cyfry po znaku $ (patrz strony perlop(1) i perlre(1) dokumentacji).
Dodatkowo, kilka zmiennych specjalnych, umoliwiajcych dostp do
wewntrznych rozwiza Perla, posiada nazwy zawierajce znaki przestankowe
(zobacz strony perlvar(1) dokumentacji).
Wartoci skalarne zawsze nosz nazwy rozpoczynajce si znakiem '$', nawet,
gdy odnosz si do skalara bdcego czci tablicy. Dziala to podobnie jak
angielski przedimek "the". A zatem mamy:
$dni # zwykla warto skalarna "dni"
$dni[28] # 29-ty element tablicy
$dni{'luty'} # warto dla klucza 'luty' z hasza %dni
$#dni # ostatni indeks tablicy @dni
ale cale tablice lub wycinki tablic oznaczane s przez '@', co dziala
jak angielskie slowo "these" lub "those":
@dni # ($dni[0], $dni[1],... $dni[n])
@dni[3,4,5] # to samo, co @dni[3..5]
@dni{'a','c'} # to samo, co ($dni{'a'},$dni{'c'})
za cale tablice asocjacyjne (hasze) oznaczane s przez '%':
%dni # (klucz1, warto1, klucz2, warto2 ...)
Dodatkowo, procedury nazywane s z uyciem pocztkowego '&', cho jest to
opcjonalne, jeli nie jest dwuznaczne (tak jak w jzyku angielskim czsto
zbyteczne jest uycie slowa"do"). Elementy tablicy symboli mog by
nazywane z uyciem pocztkowego '*', ale na razie nie musisz si tym
zajmowa.
Kady typ zmiennych ma swoj wlasn przestrze nazw. Moesz, bez obawy o
konflikt, uywa tej samej nazwy dla zmiennej skalarnej, tablicy czy
tablicy asocjacyjnej (lub uchwytu pliku, nazwy procedury czy etykiety).
Oznacza to, e $foo i @foo s dwoma ronymi zmiennymi. Znaczy to te, e
$foo[1] jest czci tablicy @foo, nie za czci skalara $foo. Moe si to
wydawa troch dziwne, ale tak ma by, gdy to jest dziwne.
Poniewa odniesienia do zmiennych i tablic zawsze rozpoczynaj si od '$',
'@' lub '%', to slowa "zarezerwowane" nie s naprawd zarezerwowane w
odniesieniu do nazw zmiennych. (Jednak S one zarezerwowane w
odniesieniu do etykiet i uchwytow plikow, ktore nie posiadaj
specjalnego pocztkowego znaku. Nie moesz, na przyklad, uy uchwytu pliku
o nazwie "log". Wskazowka: moesz napisa open(LOG,'logfile') zamiast
open(log,'logfile'). Uycie nazw uchwytow plikow zloonych z duych liter
poprawia rownie czytelno i chroni przed konfliktami z przyszlymi
slowami zastrzeonymi. Wielko liter JEST znaczca--"FOO", "Foo" oraz
"foo" s zupelnie innymi nazwami. Nazwy rozpoczynajce si liter lub
znakiem podkrelenia mog zawiera rownie cyfry i podkrelenia.
Moliwe jest zastpienie takiej alfanumerycznej nazwy wyraeniem, ktore
zwraca odwolanie do obiektu danego typu. Opis tego znajdziesz na
stronie perlref(1) podrcznika.
Nazwy rozpoczynajce si cyfr mog zawiera tylko cyfry. Nazwy, ktore nie
zaczynaj si od litery, podkrelenia ani cyfry ograniczone s do
pojedynczego znaku, np. $% czy $$. (Wikszo z tych jednoznakowych nazw
ma predefiniowane znaczenie dla Perla. Na przyklad, $$ jest
identyfikatorem biecego procesu.)
Kontekst
Interpretacja operacji i wartoci w Perlu zaley czasami od wymaga
kontekstu, w jakim uyta jest operacja czy warto. Istniej dwa glowne
konteksty: skalarny i listowy. Niektore z operacji zwracaj wartoci
listowe w kontekcie oczekujcym listy, za wartoci skalarne w przeciwnym
przypadku. (Jeli tak jest dla danej operacji, to zostanie to
wspomniane w jej opisie.) Innymi slowy, Perl przecia pewne operacje w
oparciu o to, czy spodziewana jest pojedyncza warto czy mnoga. (W
podobny sposob funkcjonuj w jzyku angielskim niektore slowa, jak "fish"
czy "sheep".)
Na zasadzie wzajemnoci, operacja dostarcza albo kontekstu skalarnego
albo listowego kademu ze swych argumentow. Na przyklad, jeli napiszesz
int( <STDIN> )
to operacja calkowita (integer) dostarcza kontekst skalarny dla
operatora <STDIN>, ktory odpowiada czytajc jeden wiersz z STDIN i
przesylajc go z powrotem do operacji integer. Ta z kolei znajduje warto
typu integer tego wiersza i zwraca j. Jeeli, z drugiej strony,
napiszesz
sort( <STDIN> )
To operacja sortowania dostarcza kontekstu listowego dla <STDIN>, ktory
bdzie przetwarza wszystkie dostpne wiersze a do koca pliku. Nastpnie
przele list tych wierszy z powrotem do procedury sortowania, ktora z
kolei posortuje dostarczone wiersze i zwroci je w postaci listy do
kontekstu w jakim wywolano sort.
Przypisanie jest troch specyficzne, w tym, i posluguje si swym lewym
argumentem do ustalenia kontekstu dla prawego argumentu. Przypisanie do
skalara oblicza praw stron w kontekcie skalarnym, podczas gdy
przypisanie do tablicy lub wycinka tablicy rozwija praw stron w
kontekcie listowym. Przypisanie do listy rownie oblicza praw stron w
kontekcie listowym.
Procedury definiowane przez uytkownika mog sprawdza, czy s wywolane w
kontekcie skalarnym czy listowym, ale wikszo z nich nie dba o to, gdy
skalary s automatycznie interpolowane w listy. Zobacz opis funkcji
wantarray na stronie perlfunc(1).
Wartoci skalarne
Wszystkie dane w Perlu s skalarami lub tablicami skalarow albo haszami
skalarow. Zmienne skalarne mog zawiera rone rodzaje pojedynczych
danych, jak liczby, lacuchy znakowe czy odwolania. Ogolnie, konwersja z
jednej postaci na drug jest transparentna. (Skalar nie moe zawiera
wielu wartoci, ale moe zawiera odwolanie do tablicy czy hasza
zawierajcych wiele wartoci.) Z powodu automatycznej konwersji
skalarow, operatory i funkcje zwracajce skalary nie musz dba o to (i
faktycznie nie dbaj), czy kontekst oczekuje lacucha czy te liczby.
Skalary nie s koniecznie t czy inn rzecz. Nie ma moliwoci
zadeklarowania zmiennej skalarnej o typie "string", "number", typu
"filehandle", czy jakiego innego. Perl jest jzykiem kontekstowo
polimorficznym, w ktorym skalary mog by lacuchami, liczbami czy
odwolaniami (co obejmuje obiekty). Lacuchy i liczby uwaane s za
mniejwicej to samo w niemal kadym zastosowaniu. Odwolania s jednak
nierzutowalnymi wskanikami o cile okrelonym typie, z wbudowanym
licznikiem odwola i wywolaniami destruktora.
Warto skalarna interpretowana jest jako prawda, TRUE, w sensie logiki
boolowskiej, jeli nie jest lacuchem pustym ani liczb zero (lub jej
lacuchowym rownowanikiem, "0"). Kontekst boolowski (logiczny) jest po
prostu specyficznym rodzajem kontekstu skalarnego.
Faktycznie istniej dwie odmiany skalarow pustych: zdefiniowane i
niezdefiniowane. Niezdefiniowane skalary puste zwracane s gdy brak jest
rzeczywistej wartoci czego, jak w przypadku wystpienia bldu lub na kocu
pliku, albo gdy odwolujesz si do niezdefiniowanej zmiennej czy elementu
tablicy. Niezdefiniowany pusty skalar moe sta si zdefiniowany po tym,
jak po raz pierwszy uyjesz go tak, jakby byl zdefiniowany. Ale przed
tym moesz posluy si operatorem defined(), by stwierdzi, czy warto jest
zdefiniowana czy te nie.
By stwierdzi, czy dany lacuch jest poprawn liczb niezerow wystarczy
zwykle porowna go zarowno z numerycznym 0 jak i leksykalnym "0" (cho
spowoduje to ostrzeenia opcji -w). Sposob ten wynika std, e lacuchy nie
bdce liczbami uwaane s za 0, tak jak w awk:
if ($str == 0 && $str ne "0") {
warn "To nie wyglda na liczb";
}
Zwykle jest to metoda preferowana, gdy w przeciwnym razie nie
traktowalby poprawnie notacji IEEE, takich jak NaN czy Infinity.
Czasami bdziesz wolal posluy si funkcj POSIX::strtod czy wyraeniem
regularnym do sprawdzenia, czy dana jest numeryczna. Dokladny opis
wyrae regularnych znajdziesz w podrczniku perlre.
warn "has nondigits" if /\D/;
warn "not a natural number" unless /^\d+$/; # odrzuca -3
warn "not an integer" unless /^-?\d+$/; # odrzuca +3
warn "not an integer" unless /^[+-]?\d+$/;
warn "not a decimal number" unless /^-?\d+\.?\d*$/; # odrzuca .2
warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/;
warn "not a C float"
unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
Dlugo tablicy jest wartoci skalarn. Moesz uzyska dlugo tablicy @dni
obliczajc $#dni, tak jak w csh. (Faktycznie, nie jest to dlugo
tablicy, a indeks ostatniego elementu, gdy (zwykle) istnieje element o
indeksie zerowym.) Przypisanie do $#dni zmienia dlugo tablicy.
Skracanie t metod tablicy niszczy wartoci pozostale za nowym kocem
tablicy. Wydluenie uprzednio skroconej tablicy JU NIE odtwarza wartoci,
ktore byly w utraconych elementach. (Bylo tak w Perlu 4, ale musielimy
z tym skoczy, by zapewni wywolywanie destruktorow tam, gdzie jest to
oczekiwane.) Moesz te osign nieco lepsz efektywno wstpnie poszerzajc
tablic, ktora ma si powikszy. (Mona take poszerza tablic wykonujc
przypisanie do elementu, ktory jest poza jej obecnym kocem.) Tablic
mona obci do zera przez przypisanie do niej pustej listy (). Ponisze s
rownowane:
@cokolwiek = ();
$#cokolwiek = -1;
Jeeli przetwarzasz nazwan tablic w kontekcie skalarnym, to zwraca on
dlugo tablicy. (Zauwa, e nie jest to prawd dla list, ktore zwracaj
ostatni warto, tak jak operator przecinka w C. Nie jest to te prawd dla
funkcji wbudowanych, zwracajcych to, na co maj ochot.) Ponisze jest
zawsze prawdziwe:
scalar(@cokolwiek) == $#cokolwiek - $[ + 1;
[Zmienna specjalna $[ okrela indeks pierwszego elementu w tablicy i
pierwszego znaku w lacuchu, domylnie jest to zero.] W wersji 5 Perla
zmieniono semantyk $[: pliki nie ustawiajce wartoci $[ nie musz ju zwaa
na to, czy inny plik zmienil jej warto. Inaczej mowic, nie zaleca si
uywania $[. Zatem ogolnie moesz zaklada, e
scalar(@cokolwiek) == $#cokolwiek + 1;
Niektorzy programici wybieraj uycie jawnej konwersji, by nie bylo
adnych wtpliwoci:
$liczba_elementow = scalar(@cokolwiek);
Jeeli poslugujesz si haszem (tablic asocjacyjn) w kontekcie skalarnym,
to zwraca on warto, ktora jest prawd wtedy i tylko wtedy, gdy hasz
zawiera jakkolwiek par klucz/warto. (Jeeli s takie pary, to warto
zwracana jest lacuchem skladajcym si z liczby uytych jednostek komorek
(buckets) oraz liczby zaalokowanych jednostek komorek, rozdzielonych
ukonikiem. Najbardziej przydaje si to do sprawdzania, czy wkompilowany
w Perl algorytm haszowania dziala kiepsko na twoim zestawie danych. Na
przyklad, wrzucasz 10,000 elementow do hasza, ale przetworzenie %HASH w
kontekcie skalarnym zwraca "1/16", co oznacza, e tylko jedna z
szesnastu komorek zostala uyta, i przypuszczalnie zawiera wszystkie
twoje 10,000 pozycji. To si nie powinno zdarzy.)
Moesz wstpnie przydzieli miejsce na hasz przy pomocy przypisania do
funkcji keys(). Zaokrgli to zaalokowane jednostki komorek do najbliszej
potgi dwojki.
keys(%users) = 1000; # zaalokuj 1024 buckets
Konstruktory wartoci skalarnych
Literaly numeryczne podawane s w zwyczajowych formatach
zmiennoprzecinkowych lub calkowitych:
12345
12345.67
.23E-10
0xffff # hex
0377 # osemkowa
4_294_967_296 # podkrelenie dla lepszej czytelnoci
Literaly lacuchowe ograniczone s zwykle przez pojedyncze lub podwojne
cudzyslowy. Dzialaj one bardzo podobnie do znakow cytowania powloki: w
literalach lacuchowych w cudzyslowach zachodzi zastpowanie zmiennych i
interpretacja odwrotnego ukonika. W lacuchach w apostrofach nie
wystpuje zastpowanie i interpretacja (z wyjtkiem "\'" oraz "\\"). To
tworzenia znakow takich jak nowa linia, tabulator itd., stosowane s
zarowno zwykle reguly uycia odwrotnego ukonika w Unixie, jak i bardziej
egzotyczne formy. List sposobow cytowania znajdziesz w sekcji Quote and
Quotelike Operators podrcznika perlop(1).
Zapisy osemkowe czy szesnastkowe w literalach lacuchowych (np.
'0xffff') nie s automatycznie zamieniane na ich calkowit reprezentacj.
Konwersje te wykonuj funkcje hex() i oct(). Wicej szczegolow znajdziesz
w opisach tych funkcji w podrczniku perlfunc(1).
Moesz te umieszcza znaki nowej linii bezporednio w lacuchach, tj., mog
one koczy si w innym wierszu ni si rozpoczly. Jest to przyjemne, ale
jeeli zapomnisz zamykajcego cudzyslowu, to bld nie bdzie zglaszany
dopoty, dopoki Perl nie znajdzie innego wiersza, zawierajcego znak
cudzyslowu, ktory moe znajdowa si o wiele dalej w skrypcie. Zastpowanie
zmiennych w lacuchach ograniczone jest do zmiennych skalarnych, tablic
oraz wycinkow tablic. (Inaczej mowic, nazw rozpoczynajcych si od $ lub
@, po ktorych moe opcjonalnie wystpi, ujte w nawiasy kwadratowe,
wyraenie traktowane jako indeks elementu tablicy.) Poniszy fragment
kodu drukuje "Cena wynosi $100."
$cena = '$100'; # nie interpretowane
print "Cena wynosi $cena.\n"; # interpretowane
Tak jak w niektorych powlokach, moesz umieci nazw w nawiasach
klamrowych, by oddzieli j od nastpujcych dalej znakow alfanumerycznych.
Identyfikator w takich nawiasach traktowany jest zawsze jako lacuch,
tak samo jak pojedynczy identyfikator bdcy indeksem hasza. Nasz
wczeniejszy przyklad,
$dni{'luty'}
moe by zapisany jako
$dni{luty}
a cudzyslowy bd domniemane automatycznie. Ale cokolwiek bardziej
skomplikowanego w indeksie zostanie zinterpretowane jako wyraenie.
Zauwa, e lacuch w pojedynczych cudzyslowach musi by oddzielony od
poprzedzajcego go slowa odstpem, gdy pojedynczy cudzyslow jest
poprawnym (cho nie zalecanym) znakiem w nazwie zmiennej (zobacz
Packages w podrczniku perlmod(1)).
Trzema specjalnymi literalami s __FILE__, __LINE__ oraz __PACKAGE__,
ktore reprezentuj nazw biecego pliku, numer wiersza oraz nazw pakietu w
danym punkcie twego programu. Mog by uywane wylcznie jako odrbne
tokeny. Nie bd one interpolowane wewntrz lacuchow. Jeeli nie ma
biecego pakietu (z powodu pustej dyrektywy package;), to __PACKAGE__
jest wartoci niezdefiniowan.
Tokenami __END__ i __DATA__ mona poslugiwa si do wskazania logicznego
koca skryptu przed faktycznym kocem pliku. Dowolny nastpujcy po nich
tekst jest ignorowany, ale moe by odczytany przy pomocy uchwytu DATA.
Wykorzystaj main::DATA dla uytego tokenu __END__, lub te
NAZWAPAKIETU::DATA (gdzie NAZWAPAKIETU jest biecym pakietem) dla
__DATA__. Dwa znaki sterujce: ^D i ^Z s synonimami dla __END__ (lub
__DATA__ w module). Szerszy opis __DATA__ i przyklad uycia znajdziesz w
podrczniku SelfLoader. Zauwa, e nie mona czyta z uchwytu pliku DATA w
bloku BEGIN. Blok ten jest wykonywany natychmiast po napotkaniu (w
czasie kompilacji). W tym momencie nie zostal jeszcze znaleziony
odpowiedni token __DATA__ (lub __END__).
Slowo nie posiadajce adnej innej interpretacji w gramatyce Perla bdzie
traktowane tak, jakby znajdowalo si w cudzyslowie. S one znane pod nazw
"golych slow" ("barewords"). Tak samo, jak w przypadku etykiet i
uchwytow plikow, gole slowa skladajce si wylcznie z malych liter naraaj
na konlikt z przyszlymi slowami zastrzeonymi. Jeeli uyjesz przelcznika
-w, to Perl bdzie ostrzegal o wystpieniu takich slow. Niektorzy
chcieliby calkowicie wyj spod prawa gole slowa. Jeli napiszesz
use strict 'subs';
to kade gole slowo, ktore nie zostanie zinterpretowane jako wywolanie
procedury spowoduje bld kompilacji. Ograniczenie to rozciga si do koca
zawierajcego je bloku. Blok wewntrzny moe je jednak zanegowa przy
pomocy no strict 'subs'.
Zmienne tablicowe w lacuchach objtych cudzyslowami interpolowane s
przez zlczenie wszystkich elementow tablicy. Elementy s wowczas
rozdzielone ogranicznikiem podanym w zmiennej $" ($LIST_SEPARATOR w
module English), domylnie spacj. Ponisze fragmenty s rownowane:
$temp = join($",@ARGV);
system "echo $temp";
system "echo @ARGV";
Wewntrz wzorcow wyszukiwania (ktore rownie podlegaj zastpowaniu w
podwojnym cytowaniu) pojawia si brzydka niejednoznaczno: czy
/$foo[bar]/ ma by interpretowane jako /${foo}[bar]/ (gdzie [bar] jest
klas znakow wyraenia regularnego) czy te jako /${foo[bar]}/ (gdzie
[bar] jest indeksem tablicy @foo)? Jeeli nie istnieje @foo, to jest to
oczywicie klasa znakow. Jeeli @foo istnieje, to Perl odgaduje czym ma
by [bar], i prawie zawsze ma racj. Jeli odgaduje le, albo po prostu
jeste paranoikiem, moesz wymusi poprawn interpretacj uywajc nawiasow
klamrowych jak powyej.
Wierszowa forma cytowania oparta jest na skladni "dokumentow-tutaj"
uywanej ("here-doc") w powlokach. Po sekwencji << podajesz napis
ograniczajcy cytowany material, a wszystkie wiersze poniej biecego a do
napisu koczcego s wartoci elementu. Napisem koczcym moe by
identyfikator (slowo) albo jaki cytowany tekst. Jeeli jest to tekst
cytowany, to rodzaj zastosowanych znakow cytowania okrela traktowanie
tekstu, tak jak przy zwyklym cytowaniu. Niecytowany identyfikator
dziala tak, jakby byl w podwojnym cudzyslowie. Pomidzy << a
identyfikatorem nie moe wystpi spacja. (Jeeli wstawisz spacj, to bdzie
ona traktowany jak pusty identyfikator, co jest poprawne i dopasowuje
pierwszy pusty wiersz.) Napis koczcy musi pojawi si w wierszu koczcym
samotnie (niecytowany i bez otaczajcych bialych znakow).
print <<EOF;
Cena wynosi $cena.
EOF
print <<"EOF"; # to samo, co powyej
Cena wynosi $cena.
EOF
print <<`EOC`; # wykonaj polecenia
echo hi there
echo lo there
EOC
print <<"foo", <<"bar"; # moesz skladowa, jeden za drugim
I said foo.
foo
I said bar.
bar
myfunc(<<"TO", 23, <<'TAMTO');
Masz tu linijk
czy dwie.
TO
a tu jeszcze jedn.
TAMTO
Nie zapomnij tylko, e musisz postawi rednik na kocu instrukcji. Perl
nie wie przecie, czy nie zamierzasz sprobowa zrobi tego:
print <<ABC
179231
ABC
+ 20;
Konstruktory wartoci listowych
Wartoci listowe oznaczane s przez oddzielenie pojedynczych wartoci
przecinkami (i otoczenie listy nawiasami jeli wymaga tego kolejno):
(LIST)
W kontekcie nie wymagajcym wartoci listowej warto literalu listowego
jest wartoci ostatniego elementu, tak jak w przypadku wystpujcego w C
operatora przecinkowego. Na przyklad,
@foo = ('cc', '-E', $bar);
przypisuje warto calej listy do tablicy foo, ale
$foo = ('cc', '-E', $bar);
przypisuje zmiennej foo warto zmiennej bar. Zauwa, e rzeczywista
tablica w kontekcie skalarnym zwraca dlugo tablicy. Poniszy kod
przypisuje $foo warto 3:
@foo = ('cc', '-E', $bar);
$foo = @foo; # $foo dostaje 3
Przed nawiasem zamykajcym list literalow moesz uy opcjonalnego
przecinka, zatem moesz pisa:
@foo = (
1,
2,
3,
);
LISTY dokonuj automatycznej interpolacji podlist. To znaczy, kiedy
przetwarzana jest LISTA, to kady jej element jest przetwarzany w
kontekcie listowym. Wynikowa warto listy interpolowana jest do listy
LISTA tak, jakby kady pojedynczy element byl czlonkiem LISTY Zatem w
LICIE trac swoj tosamo tablice i hasze--lista
(@foo,@bar,&SomeSub,%glarch)
zawiera wszystkie elementy @foo, po ktorych nastpuj wszystkie elementy
@bar, wszystkie elementy zwrocone przez procedur o nazwie SomeSub
wywolan w kontekcie listowym, i na kocu pary klucz/warto z %glarch.
Jeeli chcesz odwola si do listy, NIE wykonujc interpolacji zajrzyj do
podrcznika perlref(1).
Lista pusta reprezentowana jest przez (). Jej interpolowanie w licie
nie daje adnego efektu. Zatem ((),(),()) jest rownowane (). Podobnie,
interpolowanie tablicy bez elementow jest tym samym, co nie
interpolowanie w tym miejscu adnej tablicy.
Warto listowa moe by te indeksowana tak, jak zwykla tablica. Musisz
tylko umieci list w nawiasach, by unikn niejasnoci. Na przyklad:
# Stat zwraca warto listow
$time = (stat($file))[8];
# TUTAJ BLD SKLADNI
$time = stat($file)[8]; # Oj, zapomnialem nawiasow
# znajd cyfr szesnastkow
$hexdigit = ('a','b','c','d','e','f')[$digit-10];
# "reverse comma operator"
return (pop(@foo),pop(@foo))[0];
W licie moesz wykona przypisanie do undef. Przydaje si to do pozbywania
si niektorych wartoci zwracanych przez funkcj:
($dev, $ino, undef, undef, $uid, $gid) = stat($file);
Do list mona wykona przypisanie wtedy i tylko wtedy, gdy dozwolone jest
przypisanie do kadego z elementow listy:
($a, $b, $c) = (1, 2, 3);
($map{'czerwony'}, $map{'niebieski'}, $map{'zielony'})
= (0x00f, 0x0f0, 0xf00);
Przypisanie tablicy w kontekcie skalarnym zwraca liczb elementow
utworzonych przez wyraenie po prawej stronie przypisania:
$x = (($foo,$bar) = (3,2,1)); # ustaw $x na 3, nie 2
$x = (($foo,$bar) = f()); # ustaw $x na ilo zwroconych przez f()
Jest to bardzo wygodne, gdy chcesz wykona przypisanie listy w kontekcie
logicznym (boolowskim), gdy wikszo funkcji listowych zwraca po
zakoczeniu przetwarzania list pust, co przy przypisaniu daje 0,
interpretowane jako falsz.
Ostatni element moe by tablic lub haszem:
($a, $b, @rest) = split;
my($a, $b, %rest) = @_;
Faktycznie moesz umieci tablic lub hasza w dowolnym miejscu listy, ale
pierwsze z nich na licie wessie wszystkie wartoci i pozostale dostan
warto nul. Moe to by pomocne w local() lub my().
Literal hasza (tablicy asocjacyjnej) zawiera pary wartoci, ktore bd
interpretowane jako klucz i warto:
# takie samo przypisanie jak powyej
%map = ('czerwony',0x00f,'niebieski',0x0f0,'zielony',0xf00);
Cho listy literalow i nazwane tablice s zwykle wzajemnie wymienne, to
nie zachodzi to w przypadku haszy. To, e moesz indeksowa wartoci listy
tak jak zwyklej tablicy nie oznacza, e moesz indeksowa list tak jak
hasz. Podobnie, hasze wlczone jako czci innych list (lcznie z listami
parametrow i list zwracanych przez funkcje) zawsze ulegaj splaszczeniu
do par klucz/warto. Dlatego czasem dobrze jest uy wskazania.
Czsto bardziej czytelne jest uycie pomidzy parami klucz/warto operatora
=>. Operator ten jest po prostu bardziej wyroniajcym si wzrokowo
synonimem przecinka. Ponadto powoduje, e jego lewostronny operand jest
interpretowany jako lacuch, jeli jest on golym slowem, ktore mogloby by
poprawnym identyfikatorem. Uprzyjemnia to inicjowanie haszy:
%map = (
czerwony => 0x00f,
niebieski => 0x0f0,
zielony => 0xf00,
);
lub inicjowanie odwola do haszy, ktore bd uywane jako rekordy:
$rec = {
witch => 'Mable the Merciless',
cat => 'Fluffy the Ferocious',
date => '10/31/1776',
};
albo uycie wywolywanych przez nazw parametrow skomplikowanej funkcji:
$field = $query->radio_group(
name => 'group_name',
values => ['eenie','meenie','minie'],
default => 'meenie',
linebreak => 'true',
labels => \%labels
);
Zwro uwag na to, i fakt, e tablica asocjacyjna jest zainicjowana w
takim porzdku, nie oznacza, e zostanie zwrocona w tym samym porzdku.
Przyklady, jak uloy kolejno zwracanych wynikow znajdziesz przy opisie
sort w podrczniku perlfunc(1).
Typeglob i uchwyty plik'o'ow
Perl posluguje si wewntrznym typem zwanym typeglob. Przechowuje w nim
wszystkie zapisy tablicy symboli. Przedrostkiem typu typeglob jest *,
gdy reprezentuje on wszystkie typy. Byl on zalecanym sposobem
przekazywania tablic i tablic asocjacyjnych przez odwolanie do funkcji,
ale obecnie istniej prawdziwe odwolania, wic jest to rzadko potrzebne.
Podstawowym zastosowaniem typeglob we wspolczesnym Perlu jest tworzenie
synonimow tablicy symboli. To przypisanie:
*cos = *inne;
robi $cos synonimem (aliasem) dla $inne, @cos jest aliasem dla @inne,
%cos aliasem dla %inne, &cos aliasem dla &inne, itd. Duo bezpieczniej
jest uy odwolania (wskazania). To:
local *Tutaj::niebieski = \$Tam::zielony;
tymczasowo czyni $Tutaj::niebieski aliasem dla $Tam::zielony, ale nie
robi @Tutaj::niebieski aliasem dla @Tam::zielony, czy %Tutaj::niebieski
aliasem dla %Tam::zielony, itd. W sekcji Symbol Tables podrcznika
perlmod(1) znajdziesz wicej takich przykladow. Mimo, e moe to wyglda
dziwnie, jest to podstaw calego systemu importu/exportu modulow.
Innym zastosowaniem typeglob jest przesylanie uchwytow plikow do
funkcji lub tworzenie nowych uchwytow. Jeeli potrzebujesz posluy si
typeglob, by zachowa uchwyt pliku, zrob to tak:
$fh = *STDOUT;
albo moe jako prawdziwe odwolanie, jak to:
$fh = \*STDOUT;
W podrczniku perlsub(1) znajdziesz przyklady zastosowania typeglob jako
porednich uchwytow plikow w funkcjach.
Typeglob s rownie sposobem na tworzenie lokalnych uchwytow plikow przy
uyciu operatora local(). Istniej wowczas a do wyjcia z ich bloku, ale
mog by przeslane powtornie. Na przyklad:
sub newopen {
my $path = shift;
local *FH; # nie my!
open (FH, $path) or return undef;
return *FH;
}
$fh = newopen('/etc/passwd');
Obecnie, gdy dysponujemy notacj *foo{CO}, typeglob nie s tak czsto
uywane do manipulowania uchwytami plikow, chocia wci s konieczne do
przeslania calkiem nowego uchwytu pliku czy katalogu do funkcji czy z
funkcji. Wynika to std, e *UCHWYT{IO} dziala tylko jeli UCHWYT byl ju
uyty jako uchwyt. Inaczej mowic, do tworzenia nowych wpisow w tablicy
symboli moe posluy *FH, ale nie *foo{CO}.
Inn metod tworzenia anonimowych uchwytow plikow jest wykorzystanie
modulu IO::Handle. Zalet tych modulow jest nieukrywanie ronych typow
tej samej nazwy podczas local(). Na kocu opisu open() w podrczniku
perlfunc(1) zamieszczono odpowiedni przyklad.
Dalsze rozwaania na temat typeglob i skladni *foo{THING} znajdziesz w
podrcznikach perlref(1) i perlsub(1), a take w sekcji Symbol Tables
podrcznika perlmod(1).
INFORMACJE O T/L/LUMACZENIU
Powysze tlumaczenie pochodzi z nieistniejcego ju Projektu Tlumaczenia
Manuali i moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji,
prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.