NAZWA¶
perlfunc - Wbudowane funkcje perla
OPIS¶
Funkcje z tej sekcji mogą służyć pomocą w
wyrażeniach. Podpadają one pod dwie główne kategorie:
operatory list, oraz nazwane operatory jednoargumentowe. [Przyp. tłum.: w
perlu nie ma prawdziwych funkcji, są operatory] Różnią
się one w związku priorytetowym przecinkiem. (zobacz tablicę
priorytetów na stronie
perlop(1).). Operatory list pobierają
więcej niż jeden argument, podczas gdy operatory jednoargumentowe, z
definicji, nigdy nie biorą więcej niż jeden argument. Tak
więc przecinek kończy argument operatora jednoargumentowego, lecz
jedynie rozdziela argumenty operatora listy. Ogólnie, operator
jednoargumentowy daje swojemu argumentowi kontekst skalarny, podczas gdy
operator listowy może dawać zarówno kontekst skalarny, jak i
listowy. Jeśli daje obydwa, to argumenty skalarne będą
najpierw, a za nimi nastąpią argumenty listowe. (Zauważ,
że może istnieć tylko jeden argument listowy.) Np. funkcja
splice() ma trzy argumenty skalarne, za którymi następuje
lista.
W opisach składni, które są niżej, operatory list,
które oczekują listy (i dają kontekst listowy elementom tej
listy) są pokazywane z argumentem LISTA. Lista taka może
składać się z dowolnej kombinacji argumentów skalarnych
lub wartości listowych; wartości listowe będą
włączone w listę tak, jakby każdy pojedynczy element
był interpolowany w tym punkcie listy, tworząc
dłuższą, jednowymiarową wartość listową.
Elementy typu LISTA powinny być oddzielone przecinkami.
Każda funkcja z poniższej listy, może być użyta bez,
albo z nawiasami wokół swoich argumentów. (Opisy składni
pomijają nawiasy.) Jeśli używasz nawiasów, to prosta (lecz
czasem zaskakująca) reguła jest taka:
WYGLĄDA jak
funkcja, więc
JEST funkcją i priorytet nie ma znaczenia. W
przeciwnym wypadku jest to operator listowy lub operator jednoargumentowy i
priorytet się liczy. I biała spacja między funkcją i lewym
nawiasem nie liczy się--więc musisz być czasem ostrożny:
print 1+2+4; # Drukuje 7.
print(1+2) + 4; # Drukuje 3.
print (1+2)+4; # Też drukuje 3!
print +(1+2)+4; # Drukuje 7.
print ((1+2)+4); # Drukuje 7.
Jeśli uruchamiasz perla z przełącznikiem
-w, to
będziesz o tym ostrzegany. Na przykład trzecia z powyższych
linii daje w efekcie:
print (...) interpreted as function at - line 1.
Useless use of integer addition in void context at - line 1.
Dla instrukcji, które mogą być używane zarówno w
kontekstach skalarnych, jak i listowych, błąd nie wymagający
przerwania jest ogólnie wskazywany w kontekście skalarnym przez
zwrot niezdefiniowanej wartości, a w kontekście listowym przez zwrot
listy null.
Zapamiętaj następującą regułę:
- NIE ISTNIEJE OGÓLNA REGUŁA KONWERSJI LISTY W
SKALAR!
Każdy operator i funkcja decyduje, jaki rodzaj wartości jest
najbardziej odpowiedni do zwrócenia w kontekście skalarnym.
Niektóre operatory zwracają długość listy, która
byłaby zwrócona w kontekście listowym. Niektóre
zwracają pierwszą wartość listy. Niektóre
zwracają ostatnią wartość listy. Inne zwracają
liczbę pomyślnych operacji. Ogólnie, robią one to, czego
chcesz, chyba że oczekujesz spójności.
Funkcje perla według kategorii
Oto funkcje perla (włączając rzeczy, które
wyglądają jak funkcje, np. niektóre słowa kluczowe i
nazwane operatory), poukładane według kategorii. Niektóre
funkcje pojawiają się w więcej niż jednym miejscu.
- Funkcje dla skalarów lub łańcuchów
- chomp, chop, chr, crypt, hex, index, lc, lcfirst, length,
oct, ord, pack, q/ŁAŃCUCH/, qq/ŁAŃCUCH/, reverse,
rindex, sprintf, substr, tr///, uc, ucfirst, y///
- Wyrażenia regularne i porównywanie
wzorców
- m//, pos, quotemeta, s///, split, study
- Funkcje numeryczne
- abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt,
srand
- Funkcje dla prawdziwych tablic (@ARRAYs)
- pop, push, shift, splice, unshift
- Funkcje dla danych listowych
- grep, join, map, qw/ŁAŃCUCH/, reverse, sort,
unpack
- Funkcje dla %HASHów (tablic asocjacyjnych)
- delete, each, exists, keys, values
- Funkcje wejścia i wyjścia
- binmode, close, closedir, dbmclose, dbmopen, die, eof,
fileno, flock, format, getc, print, printf, read, readdir, rewinddir,
seek, seekdir, select, syscall, sysread, sysseek, syswrite, tell, telldir,
truncate, warn, write
- Funkcje dla danych o określonej długości lub
rekordów
- pack, read, syscall, sysread, syswrite, unpack, vec
- Funkcje dla deskryptorów plików, plików lub
katalogów
- -X, chdir, chmod, chown, chroot, fcntl, glob, ioctl,
link, lstat, mkdir, open, opendir, readlink, rename, rmdir, stat, symlink,
umask, unlink, utime
- Słowa kluczowe związane z kontrolą
działania programu
- caller, continue, die, do, dump, eval, exit, goto, last,
next, redo, return, sub, wantarray
- Słowa kluczowe związane z zakresami
- caller, import, local, my, package, use
- Różne funkcje
- defined, dump, eval, formline, local, my, reset, scalar,
undef, wantarray
- Funkcje dla procesów i grup procesów
- alarm, exec, fork, getpgrp, getppid, getpriority, kill,
pipe, qx/ŁAŃCUCH/, setpgrp, setpriority, sleep, system, times,
wait, waitpid
- Słowa kluczowe związane z modułami
perla
- do, import, no, package, require, use
- Słowa kluczowe związane z klasami i
obiektowością
- bless, dbmclose, dbmopen, package, ref, tie, tied, untie,
use
- Niskopoziomowe funkcje gniazd
- accept, bind, connect, getpeername, getsockname,
getsockopt, listen, recv, send, setsockopt, shutdown, socket, socketpair
- Funkcje komunikacji międzyprocesowej Systemu V
- msgctl, msgget, msgrcv, msgsnd, semctl, semget, semop,
shmctl, shmget, shmread, shmwrite
- Pobieranie informacji użytkownika i grupy
- endgrent, endhostent, endnetent, endpwent, getgrent,
getgrgid, getgrnam, getlogin, getpwent, getpwnam, getpwuid, setgrent,
setpwent
- Pobieranie informacji sieciowej
- endprotoent, endservent, gethostbyaddr, gethostbyname,
gethostent, getnetbyaddr, getnetbyname, getnetent, getprotobyname,
getprotobynumber, getprotoent, getservbyname, getservbyport, getservent,
sethostent, setnetent, setprotoent, setservent
- Funkcje związane z czasem
- gmtime, localtime, time, times
- Funkcje nowe w perl5
- abs, bless, chomp, chr, exists, formline, glob, import, lc,
lcfirst, map, my, no, prototype, qx, qw, readline, readpipe, ref, sub*,
sysopen, tie, tied, uc, ucfirst, untie, use
* - sub było słowem kluczowym w perl4, lecz w perl5 jest to
operator, który może być używany w wyrażeniach.
- Funkcje przedawnione w perl5
- dbmclose, dbmopen
Alfabetyczny listing funkcji perla
- -X UCHWYTPLIKU
-
- -X WYRAŻ
-
- -X
- Test pliku, gdzie X jest jedną z niżej
wymienionych liter. Ten jednoargumentowy operator pobiera argument,
nazwę pliku lub jego uchwyt. Następnie testuje plik i sprawdza,
czy coś jest w nim prawdziwe. Jeśli argument zostanie
pominięty, testuje $_, nie licząc -t, które testuje STDIN.
Zasadniczo zwraca 1 dla wyniku pozytywnego i '' dla negatywnego, a
wartość niezdefiniowaną, jeśli plik nie istnieje. Mimo
śmiesznych nazw, priorytety są takie same jak każdym innym
nazwanym operatorze jednoargumentowym i argument może być
otoczony nawiasami. Operator może być jednym z:
-r Plik jest odczytywalny przez efektywny uid/gid.
-w Plik jest zapisywalny przez efektywny uid/gid.
-x Plik jest wykonywalny przez efektywny uid/gid.
-o Właścicielem pliku jest efektywny uid.
-R Plik jest odczytywalny przez rzeczywisty uid/gid.
-W Plik jest zapisywalny przez rzeczywisty uid/gid.
-X Plik jest wykonywalny przez rzeczywisty uid/gid.
-O Właścicielem pliku jest rzeczywisty uid.
-e Plik istnieje.
-z Plik ma rozmiar zerowy.
-s Plik ma rozmiar niezerowy (zwraca rozmiar).
-f Plik jest prostym plikiem.
-d Plik jest katalogiem.
-l Plik jest dowiązaniem symbolicznym.
-p Plik jest nazwanym potokiem (FIFO).
-S Plik jest gniazdem.
-b Plik jest blokowym plikiem specjalnym.
-c Plik jest znakowym plikiem specjalnym.
-t Uchwyt pliku jest otwarty do tty.
-u Plik ma ustawiony bit `setuid'.
-g Plik ma ustawiony bit `setgid'.
-k Plik ma ustawiony bit `sticky'.
-T Plik jest plikiem tekstowym.
-B Plik jest plikiem binarnym (przeciwieństwo -T).
-M Wiek pliku w dniach, gdy uruchomił się skrypt
-A To samo dla czasu dostępu.
-C To samo dla zmiany informacji inode.
Interpretacja operatorów praw pliku -r, -R, -w, -W, -x i -X bazuje
jedynie na prawach pliku i uid/gid użytkownika. Mogą
istnieć inne powody, dla których w rzeczywistości nie
możesz go odczytać, zapisać lub uruchomić. Zauważ
też, że dla superużytkownika, operatory -r, -R, -w, i -W
zawsze zwracają 1, a -x i -X zwracają 1, jeśli ustawiony
jest tak dowolny bit wykonania. Skrypty uruchamiane przez
superużytkownika powinny więc wywoływać do celów
testowania praw pliku funkcję stat() lub tymczasowo
zmienić uid na coś innego.
Przykład:
while (<>) {
chop;
next unless -f $_; # ignoruj specjalne
...
}
Zauważ, że -s/a/b/ nie dokonuje zanegowanego podstawienia.
Powiedzenie -exp($foo) działa wciąż zgodnie z
oczekiwaniami, jednak jedynie pojedyncze litery za znakiem minusa są
interpretowane jako testy plikowe.
Przełączniki -T i -B działają tak, że testują
pierwszy blok pliku w poszukiwaniu dziwnych znaków, takich jak dziwne
kody sterujące, lub znaki z wysokiego zestawu znaków. Jeśli
jest ich zbyt wiele (>30%), to jest to plik -B, w przeciwnym wypadku to
plik -T. Dodatkowo, każdy plik, zawierający w pierwszym bloku
null jest uważany za plik binarny. Jeśli -T lub -B jest
używane na uchwycie pliku, to testowany jest bieżący bufor
standardowego wejścia zamiast pierwszego bloku. Zarówno -T jak i
-B zwracają odpowiedź pozytywną dla pliku null lub pliku,
który jest na EOF podczas testowania jego uchwytu. Z uwagi na to,
że dla testu -T trzeba odczytać plik, w większości
przypadków używa się najpierw -f, jak w next unless -f
$file && -T $file.
Jeśli któryś z operatorów testu plików (lub
stat() czy lstat()) otrzymałby specjalny uchwyt pliku,
składający się z samego podkreślenia, to użyta
zostałaby struktura `stat' z poprzedniego testu pliku,
oszczędzając wywołania systemowego. (Nie działa to dla
-t, a ponadto powinieneś pamiętać, że lstat() i
-l zostawiają w strukturze wartości dla dowiązań
symbolicznych, a nie rzeczywistych plików.) Przykład:
print "Can do.\n" if -r $a ⎪⎪ -w _ ⎪⎪ -x _;
stat($filename);
print "Readable\n" if -r _;
print "Writable\n" if -w _;
print "Executable\n" if -x _;
print "Setuid\n" if -u _;
print "Setgid\n" if -g _;
print "Sticky\n" if -k _;
print "Text\n" if -T _;
print "Binary\n" if -B _;
- abs WARTOŚĆ
-
- abs
- Zwraca moduł argumentu. Jeśli parametr
WARTOŚĆ zostanie pominięty, to używane jest $_.
- accept NOWEGNIAZDO,GNIAZDO
- Przyjmuje nadchodzące połączenie na
gnieździe, podobnie jak wywołanie systemowe accept(2). Po
sukcesie zwraca spakowany adres, a w razie porażki FALSE.
Przykład użycia można znaleźć w sekcji
Sockets: Client/Server Communication strony podręcznika
perlipc(1).
- alarm SEKUNDY
-
- alarm
- Powoduje, że sygnał ALARM jest dostarczany do
tego procesu po określonej liczbie sekund. Jeśli nie podano
parametru sekund, używana jest wartość zachowana w $_.
(Niestety na niektórych maszynach czas może być do sekundy
krótszy niż ten, który podasz, zależnie od sposobu
zliczania sekund.) Naraz odliczać może tylko jeden zegar.
Każde wywołanie wyłącza poprzedni zegar, a argument 0
wyłącza poprzedni zegar bez uruchamiania nowego. Zwrócona
wartość jest ilością czasu, pozostającego
poprzedniemu zegarowi.
Dla opóźnień lub większej dokładności niż
jedna sekunda, możesz użyć perlowego interfejsu
syscall(), i dostać się do setitimer(2), o ile
twój system to obsługuje. W przeciwnym wypadku obejrzyj opis
select(), gdzieś w tym dokumencie. Ogólnie częstym
błędem jest łączenie wywołań alarm()
i sleep().
Jeśli chcesz używać alarm() do timeout'owania
wywołania systemowego, musisz użyć pary eval/die. Nie
można oczekiwać, że alarm spowoduje, że wywołanie
systemowe się zakończy, z $! ustawionym na EINTR, gdyż na
niektórych systemach perl ustawia obsługę
sygnałów tak, że wywołania systemowe są
restartowane. Używanie eval/die działa zawsze.
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB \n wymagane
alarm $timeout;
$nread = sysread SOCKET, $buffer, $size;
alarm 0;
};
die if $@ && $@ ne "alarm\n"; # propaguj błędy
if ($@) {
# timeout
}
else {
# bez timeouta
}
- atan2 Y,X
- Zwraca arcus tangens z Y/X, w zakresie -pi do pi.
Dla operacji tangens, możesz użyć funkcji
POSIX::tan(), lub użyć znanej relacji:
sub tan { sin($_[0]) / cos($_[0]) }
- bind GNIAZDO,NAZWA
- Przywiązuje adres sieciowy do gniazda, podobnie jak
wywołanie systemowe bind(2). Po sukcesie zwraca TRUE, a w przeciwnym
wypadku FALSE. NAZWA powinna być spakowanym adresem, typu
odpowiedniego dla gniazda. Zobacz przykłady w sekcji Sockets:
Client/Server Communication na stronie podręcznika
perlipc(1).
- binmode UCHWYTYPLIKU
- Powoduje, że plik przełącza się w tryb
binarny zapisu/odczytu. Ma to miejsce w systemach operacyjnych, które
dokonują takiego rozróżnienia. Pliki, które nie
są w trybie binarnym, ukrywają wejściowe sekwencje CR LF
pod LF, a sekwencje wyjściowe LF są tłumaczone na CR LF.
Tryb binarny nie wpływa na nic pod Unixem; jednak pod MS-DOS i innymi
archaicznymi systemami, może to być niezbędna
właściwość--w przeciwnym wypadku twoja biblioteka C
może zniekształcić plik. Kluczem do rozróżniania
systemów, które potrzebują trybu binarnego od tych,
które go nie potrzebują, jest ich format pliku tekstowego.
Systemy podobne do Unix i Plan9, oddzielają linie pojedynczym znakiem
i kodują go w C jako '\n'. Nie potrzebują one trybu binarnego.
Wszystkie inne potrzebują. Jeśli UCHWYTPLIKU jest
wyrażeniem, to wartość brana jest jako nazwa uchwytu pliku.
- bless REF,NAZWAKLASY
-
- bless REF
- Funkcja ta mówi rzeczy, wskazywanej przez
referencję REF, że jest teraz obiektem w pakiecie
NAZWAKLASY--lub w bieżącym pakiecie, jeśli nie podano
parametru nazwy klasy. Funkcja zwraca dla pewności referencję,
gdyż jest ona często ostatnią rzeczą w konstruktorze.
Jeśli błogosławiona funkcja ma być dziedziczona w
klasach potomnych, to zawsze używaj wersji dwuargumentowej tej
funkcji. Dla dalszych informacji o błogosławieniu obiektów
zobacz stronę perlobj(1).
- caller WYRAŻ
-
- caller
- Zwraca kontekst bieżącego wywołania
podprocedury. W kontekście skalarnym, jeśli było
wywołanie, tj. jeśli jesteśmy w podprocedurze lub
eval() lub require(), zwraca nazwę pakietu
wywołującego, a w przeciwnym razie wartość
niezdefiniowaną. W kontekście listowym, zwraca
($pakiet, $nazwapliku, $linia) = caller;
Z parametrem WYRAŻ zwraca trochę dodatkowych danych, z
których korzysta debugger do drukowania śladu stosu.
Wartość WYRAŻ wskazuje, o ile ramek wywołań
należy się cofnąć od bieżącej.
($pakiet, $nazwapliku, $linia, $podprocedura,
$maargumenty, $chcetablię, $teksteval, $jest_require) = caller($i);
$podprocedura tutaj może być "(eval)", jeśli ramka
nie jest wywołaniem podproceduralnym. W tej sytuacji ustawiane
są dodatkowe elementy, $teksteval i $jest_require: $jest_require jest
prawdziwe, jeśli ramka została utworzona w instrukcji require
lub use, $teksteval zawiera tekst instrukcji eval WYRAŻ. Praktycznie,
dla instrukcji eval BLOCK, $nazwapliku to "(eval)", a $teksteval
jest niezdefiniowany. (Zauważ też, że każda instrukcja
use tworzy ramkę require. (wewnątrz ramki eval WYRAŻ)
Co więcej, po wywołaniu z pakietu DB, caller zwraca jeszcze
dokładniejsze dane: ustawia zmienną listową @DB::args na
argumenty, z którymi wywołano podprocedurę.
- chdir WYRAŻ
- Zmienia katalog roboczy na WYRAŻ. Jeśli WYRA jest
pominięte, to zmienia katalog na katalog domowy. Po sukcesie zwraca
TRUE, a w przeciwnym wypadku FALSE. Zobacz przykład przy opisie
die().
- chmod LISTA
- Zmienia prawa listy plików. Pierwszy element listy
musi być numerycznym zapisem praw, który powinien być
liczbą ósemkową, a który z pewnością nie
powinien być łańcuchem cyfr ósemkowych: 0644 jest ok,
ale '0644' nie jest. Zwraca liczbę plików, których prawa
zmieniono. Jeśli wszystkim co masz jest łańcuch, zobacz
też wpis oct, znajdujący się gdzie indziej w tym
dokumencie.
$cnt = chmod 0755, 'foo', 'bar';
chmod 0755, @executables;
$mode = '0644'; chmod $mode, 'foo'; # ustawia prawa na --w----r-T!
$mode = '0644'; chmod oct($mode), 'foo'; # to jest lepsze
$mode = 0644; chmod $mode, 'foo'; # to jest najlepsze
- chomp ZMIENNA
-
- chomp LISTA
-
- chomp
- Jest to troszkę bezpieczniejsza wersja wpisu chop,
opisanego gdzie indziej w tym dokumencie. Usuwa wszelkie zakończenia
linii, które odpowiadają bieżącej wartości $/
(znanego też jako $INPUT_RECORD_SEPARATOR w module English). Zwraca
całkowitą liczbę znaków, usuniętych ze wszystkich
argumentów. Często jest używany do usuwania nowych linii z
końca rekordu wejściowego jeśli obawiasz się, że
rekordowi może jej brakować. W trybie `paragraph' ($/ =
""), usuwa wszystkie kończące znaki nowych linii z
łańcuchów. Jeśli pominięta zostanie ZMIENNA, to
ucinane jest $_. Przykład:
while (<>) {
chomp; # zapobiegaj \n na ostatnim polu
@array = split(/:/);
...
}
Możesz w zasadzie uciąć wszystko co jest
lwartością, włączając przypisanie:
chomp($cwd = `pwd`);
chomp($answer = <STDIN>);
Jeśli ucinasz listę, obcinany jest każdy element, a zwracana
jest lista usuniętych znaków.
- chop ZMIENNA
-
- chop LISTA
-
- chop
- Odrywa ostatni znak łańcucha i zwraca jego
wartość. Jest przede wszystkim używany do usuwania nowej
linii z końca rekordu wejściowego, lecz jest dużo bardziej
efektywny niż s/\n//, ponieważ ani nie skanuje, ani nie kopiuje
łańcucha. Jeśli pominięto ZMIENNĄ, odrywa $_.
Przykład:
while (<>) {
chop; # zapobież \n na ostatnim polu
@array = split(/:/);
...
}
Możesz w zasadzie oderwać cokolwiek, co jest lwartością,
włączając przypisanie:
chop($cwd = `pwd`);
chop($answer = <STDIN>);
Jeśli obrywasz listę, obrywany jest każdy element. Zwracana
jest tylko wartość ostatniego oderwania.
Zauważ, że chop zwraca ostatni znak. Aby zwrócić
wszystkie poza ostatnim, użyj substr($lancuch, 0, -1).
- chown LISTA
- Zmienia właściciela (i grupę) listy
plików. Pierwsze dwa argumenty listy muszą być
NUMERYCZNYMI uid i gid, podanym w tej kolejności. Zwraca
liczbę plików, na których powiodła się zamiana.
$cnt = chown $uid, $gid, 'foo', 'bar';
chown $uid, $gid, @filenames;
Oto przykład, który podgląda nienumeryczne uid'y w pliku z
hasłami:
print "User: ";
chop($user = <STDIN>);
print "Files: "
chop($pattern = <STDIN>);
($login,$pass,$uid,$gid) = getpwnam($user)
or die "$user not in passwd file";
@ary = <${pattern}>; # rozwiń nazwy plików
chown $uid, $gid, @ary;
Na większości systemów nie możesz zmieniać
właścicielstwa, chyba że jesteś
superużytkownikiem, choć powinieneś być w stanie
zmieniać grupę na dowolną z twoich drugorzędnych grup.
Na niezabezpieczonych systemach ograniczenia te mogą być
mniejsze, lecz nie jest to przenośne założenie.
- chr LICZBA
-
- chr
- Zwraca znak, reprezentowany przez LICZBĘ w zbiorze
znaków. Na przykład, chr(65) to "A" w ASCII. Dla
odwrócenia tego działania, użyj ord, które jest
opisane gdzie indziej w tym dokumencie.
Jeśli pominięto LICZBĘ, to używane jest $_.
- chroot NAZWAPLIKU
-
- chroot
- Funkcja ta działa tak samo jak wywołanie
systemowe chroot(2): powoduje, że podany katalog staje się nowym
katalogiem głównym dla wszelkich nowych ścieżek,
które będą się zaczynały od "/". Tyczy
się to twojego procesu i jego dzieci. Ze względów
bezpieczeństwa, wywołanie to jest zastrzeżone dla
superużytkownika. Jeśli pominięto NAZWĘPLIKU, to
używany jest $_.
- close UCHWYTPLIKU
- Zamyka plik lub potok związany z uchwytem,
zwracając TRUE jedynie w wypadku, gdy stdio da radę
opróżnić wszystkie bufory i zamknąć systemowy
deskryptor pliku. Jeśli uchwyt pliku pochodził od otwartego
potoku, funkcja zwróci FALSE jeśli któreś z
potrzebnych wywołań systemowych zawiedzie lub jeśli program
zakończy pracę z niezerowym statusem. (Jeśli problemem jest
fakt, że program skończył się z niezerowym kodem, to
$! będzie ustawione na 0.) Nie musisz zamykać UCHWYTUPLIKU,
jeśli chcesz go zaraz potem wykorzystać do innego otwarcia
open(), ponieważ funkcja open() zamknie go za ciebie.
Jednak jawne zamknięcie pliku wejściowego resetuje licznik linii
($.), podczas gdy niejawne zamknięcie w open() tego nie robi.
Poza tym, zamykanie potoku powoduje oczekiwanie na zakończenie
procesu z potoku, na wypadek gdybyś chciał później
obejrzeć wyjście potoku. Jawne zamykanie potoku wstawia
wartość statusu komendy do $?. Przykład:
open(OUTPUT, '⎪sort >foo'); # potok do `sort'
... # drukuj różne rzeczy na wyjście
close OUTPUT; # czekaj na zakończenie `sort'
open(INPUT, 'foo'); # pobierz wyniki sortowania
UCHWYTPLIKU może być wyrażeniem, którego
wartość daje rzeczywistą nazwę uchwytu pliku.
- closedir UCHWYTKATALOGU
- Zamyka katalog, otworzony funkcją opendir().
- connect GNIAZDO,NAZWA
- Próbuje połączyć się ze zdalnym
gniazdem, zupełnie tak jak wywołanie systemowe connect(2). Po
sukcesie zwraca TRUE, a w przeciwnym wypadku FALSE. NAZWA powinna być
spakowanym typem adresu, odpowiednim dla gniazda. Zobacz przykłady w
sekcji Sockets: Client/Server Communication na stronie
podręcznika perlipc(1).
- continue BLOK
- W rzeczywistości jest to instrukcja kontroli
wykonywania programu, a nie funkcja. Jeśli do BLOKU
dołączone jest continue BLOK (zazwyczaj we while lub foreach),
to jest zawsze wykonywany tuż przed kolejnym wykonaniem warunku,
zupełnie jak trzecia część pętli for w C. Tak
więc może być używane do zwiększania zmiennej
pętli, nawet gdy pętla była kontynuowana z pomocą
instrukcji next (która jest podobna do instrukcji continue z C).
- cos WYRAŻ
- Zwraca cosinus z WYRAŻ (wyrażonego w radianach).
Jeśli pominie się argument WYRAŻ, to używany jest $_.
Dla operacji arcus cosinus, możesz użyć funkcji
POSIX::acos(), lub następującej relacji:
sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) }
- crypt CZYSTYTEKST,SALT
- Koduje łańcuch na wzór funkcji
crypt(3) z biblioteki C. Może to być użyteczne np.
do sprawdzania plików z hasłami w poszukiwaniu słabych
haseł. Robić to powinni tylko ludzie noszący białe
kapelusze.
Zauważ, że crypt jest funkcję jednokierunkową, podobnie
jak rozbijanie jajek na omlet. Nie istnieje (znana) funkcja
dekodująca. W wyniku, funkcja wcale nie jest tak użyteczna do
kryptografii. (Dla tego, zobacz najbliższy mirror CPAN.)
Oto przykład, który daje pewność, że ktokolwiek
uruchomi ten program, zna swoje własne hasło:
$pwd = (getpwuid($<))[1];
$salt = substr($pwd, 0, 2);
system "stty -echo";
print "Hasło: ";
chop($word = <STDIN>);
print "\n";
system "stty echo";
if (crypt($word, $salt) ne $pwd) {
die "Niezmiernie mi przykro...\n";
} else {
print "ok\n";
}
Oczywiście wpisywanie swojego hasła za każdym razem, gdy
ktoś o nie poprosi jest niemądre.
- dbmclose HASH
- [Funkcja ta jest przedawniona przez funkcję
untie().]
Przerywa powiązanie między plikiem DBM a tablicą
asocjacyjną.
- dbmopen HASH,NAZWADB,PRAWA
- [funkcja ta jest przedawniona przez funkcję
tie().]
Łączy to plik dbm(3), ndbm(3), sdbm(3),
gdbm(), lub Berkeley DB z tablicą asocjacyjną. HASH jest
nazwą tablicy asocjacyjnej. (w przeciwieństwie do normalnego
otwierania, pierwszy argument NIE jest uchwytem pliku, choć
wygląda podobnie). NAZWADB jest nazwą bazy danych (bez
rozszerzeń w rodzaju .dir czy .pag). Jeśli baza
nie istnieje, to jest tworzona z prawami określanymi przez PRAWA
(zmodyfikowanymi przez umask()). Jeśli twój system
obsługuje tylko starsze funkcje DBM, to możesz w swoim programie
wykonać tylko jeden dbmopen(). W starszych wersjach perla,
jeśli system nie miał ani DBM, ani ndbm, wywołanie
dbmopen powodowało błąd krytyczny; teraz schodzi do
sdbm(3).
Jeśli nie masz prawa zapisu do pliku DBM, to możesz tylko
odczytywać zmienne asocjacyjne, nie możesz ich ustawiać.
Jeśli chcesz spróbować, czy możesz zapisywać,
użyj albo testów plikowych, albo spróbuj ustawić
próbny wpis asocjacyjny wewnątrz eval(), co przechwyci
błąd.
Zauważ, że funkcje takie, jak keys() i values()
mogą zwracać w użyciu z plikami DBM wielkie tablice.
Możesz do iteracji przez wielkie pliki DBM używać
także each(). Przykład:
# drukuj offsety pliku historii
dbmopen(%HIST,'/usr/lib/news/history',0666);
while (($key,$val) = each %HIST) {
print $key, ' = ', unpack('L',$val), "\n";
}
dbmclose(%HIST);
Zobacz też stronę podręcznika AnyDBM_File -- jest tam
bardziej ogólny opis wad i zalet różnych podejść
dbm. Zobacz też stronę DB_File, dla bogatej
implementacji.
- defined WYRAŻ
-
- defined
- Zwraca wartość logiczną,
mówiącą czy WYRAŻ ma wartość inną od
niezdefiniowanej undef. Jeśli WYRAŻ nie jest obecne, to
testowane jest $_.
Wiele operacji zwraca undef aby wskazać błąd, koniec pliku,
błąd systemowy, niezainicjalizowaną zmienną i inne
wyjątki. Funkcja ta pozwala odróżnić undef od innych
wartości. (Prosty test logiczny nie rozróżni undef, zero,
pustego łańcucha, i "0", które wszystkie są
jednakowo fałszywe.) Zauważ, że ponieważ undef jest
prawidłowym skalarem, to jego obecność niekoniecznie
musi wskazywać warunek wyjątkowy: pop() zwraca undef gdy
jego argument jest pustą tablicą, lub gdy zwracany
element jest wartością Wundef.
defined() można używać też do sprawdzania czy
podprocedura wychodzi. Z drugiej strony, używanie defined() na
agregatach (tablicach asocjacyjnych i tablicach) nie musi
zwrócić zgodnych z intuicją wyników i powinno się
go w tych przypadkach unikać.
Gdy używane na elemencie tablicy asocjacyjnej, mówi czy
wartość jest zdefiniowana, a nie czy taki klucz istnieje w
tablicy. Dla tego celu, użyj exists, które jest opisane gdzie
indziej w tym dokumencie.
Przykłady:
print if defined $switch{'D'};
print "$val\n" while defined($val = pop(@ary));
die "Can't readlink $sym: $!"
unless defined($value = readlink $sym);
sub foo { defined &$bar ? &$bar(@_) : die "Brak bar"; }
$debugging = 0 unless defined $debugging;
Uwaga: Wielu ludzi nadużywa defined(), a potem są oni
zaskoczeni, że liczba 0 i "" (łańcuch o
długości zero) są w rzeczywistości wartościami
zdefiniowanymi. Na przykład, jeśli powiesz
"ab" =~ /a(.*)b/;
to porównanie wzorca się powiedzie i $1 będzie zdefiniowane,
niezależnie od tego, że trafiło w "nic". W
rzeczywistości nie można powiedzieć, że trafiło w
"nic". Raczej trafiło w coś, o długości zera
znaków. Jest to wszystko bardzo czyste i uczciwe. Gdy funkcja zwraca
wartość niezdefiniowaną, jest to przyznanie się,
że nie mogła dać uczciwej odpowiedzi. Tak więc
powinieneś używać defined() tylko jeśli
sprawdzasz działanie tego, co próbujesz osiągnąć.
W niektórych wypadkach, rzeczą, której oczekujesz jest
proste porównanie z 0 lub "".
Obecnie używanie defined() na całej tablicy lub tablicy
asocjacyjnej, zgłasza tylko czy została dla niego zaalokowana
pamięć. Tak więc tablica, którą ustawiasz na
pustą listę jest początkowo niezdefiniowana, a gdy się
zapełni, staje się zdefiniowana. Zamiast tego powinieneś
użyć prostego testu rozmiaru:
if (@an_array) { print "ma elementy tablicowe\n" }
if (%a_hash) { print "ma elementy asocjacyjne\n" }
Użycie na nich undef() powoduje wyczyszczenie ich pamięci i
zgłoszenie, że nie są już zdefiniowane. Nie powinno
się jednak tego robić, chyba że nie masz zamiaru ich
więcej używać, ponieważ po prostu szybciej jest
używać pamięci gotowej do wypełnienia, niż
alokować ją od nowa.
Zachowanie defined() na agregatach może zostać zmienione,
poprawione, lub zepsute w następnych wersjach perla.
Zobacz też opisy undef, exists, i ref, znajdujące się w
innych miejscach tego dokumentu.
- delete WYRAŻ
- Kasuje podany klucz(e) i związane z nim
wartości z tablicy asocjacyjnej. Dla każdego klucza, zwracana
jest skasowana wartość związana z kluczem albo
wartość niezdefiniowana, jeśli taki klucz nie istniał.
Kasowanie z $ENV{} modyfikuje środowisko. Kasowanie z tablicy
asocjacyjnej, podłączonej do pliku DBM, kasuje wpis z pliku.
(lecz kasowanie z takiego pliku nie musi zwracać niczego.)
Następujący przykład kasuje wszystkie wartości tablicy
asocjacyjnej:
foreach $key (keys %HASH) {
delete $HASH{$key};
}
Podobnie robi następujące:
delete @HASH{keys %HASH}
(Ale obydwa są wolniejsze niż komenda undef().)
Zauważ, że WYRAŻ może być arbitralnie
skomplikowany tak długo, dopóki końcowa operacja jest
podejrzeniem elementu asocjacyjnego lub wycinkiem tablicy asocjacyjnej
(`hash slice'):
delete $ref->[$x][$y]{$key};
delete @{$ref->[$x][$y]}{$key1, $key2, @morekeys};
- die LISTA
- Poza obrębem eval() drukuje wartość
LISTY na STDERR i kończy pracę z bieżącą
wartością $! (errno). Jeśli $! wynosi 0, to kończy z
wartością ($? >> 8) (status poprzedniej `komendy`).
Jeśli ($? >> 8) jest zerem, to kończy z
wartością 255. Wewnątrz eval, komunikat o
błędzie jest pakowany do $@, a eval() jest przerywany
wartością niezdefiniowaną; powoduje to, że
die() może podnieść wyjątek.
Równoważne przykłady:
die "Nie mogę przejść do spool: $!\n" unless chdir '/usr/spool/news';
chdir '/usr/spool/news' or die "Nie mogę przejść do spool: $!\n"
Jeśli wartość WYRAŻ nie kończy się nową
linią, drukowany jest również numer bieżącej
linii skryptu i wejścia, a za nimi doklejana jest nowa linia.
Wskazówka: Czasami dodanie ", stopped" do twojego
komunikatu może nadać mu więcej sensu po doklejeniu
łańcucha "at foo line 123". Załóżmy,
że uruchamiasz skrypt "canasta".
die "/etc/games is no good";
die "/etc/games is no good, stopped";
dają w efekcie odpowiednio:
/etc/games is no good at canasta line 123.
/etc/games is no good, stopped at canasta line 123.
Zobacz także exit() i warn().
Można zaaranżować sprawę tak, że callback
będzie wywoływany tuż przed uczynieniem swojej
powinności przez die(). Należy w tym celu ustawić
hak $SIG{__DIE__}. Związany handler zostanie wywołany z tekstem
błędu i może zmienić treść komunikatu
błędu, wywołując die() ponownie. Zobacz
stronę perlvar(1), dla dalszych detali o ustawianiu
wpisów %SIG, a także opis eval() dla paru
przykładów.
- do BLOK
- Nie jest to funkcja. Zwraca wartość ostatniej
komendy w sekwencji komend, wskazywanych przez BLOK. Po zmodyfikowaniu
przez modyfikator pętli, wywołuje jednokrotnie BLOK przed
sprawdzeniem warunku pętli. (W innych instrukcjach modyfikatory
pętli sprawdzają warunek na samym początku.)
- do PODPROCEDURA(LISTA)
- Niezalecana forma wywołania podprocedury. Zobacz
stronę perlsub(1).
- do WYRAŻ
- Używa wartości WYRAŻ jako nazwy pliku i
wykonuje zawartość tego pliku jako skrypt perla. Podstawowym
zadaniem tej instrukcji jest włączanie podprocedur z bibliotek
perla.
do 'stat.pl';
jest zupełnie jak
eval `cat stat.pl`;
tylko trochę bardziej efektywne, utrzymuje śledzenie
bieżącej nazwy plików dla komunikatów o
błędach i przeszukuje wszystkie katalogi -I, jeśli
plik nie znajduje się w katalogu bieżącym (zobacz
także tablicę @INC w sekcji Predefined Names
podręcznika perlvar(1)). Jednak jest takie samo w sensie,
że przetwarza (parses) plik za każdym razem, gdy go
wywołasz, więc przypuszczalnie nie chciałbyś tego
wewnątrz pętli.
Zauważ, że włączanie modułów bibliotecznych
można załatwić lepiej z pomocą operatorów
use() i require(), które również
dokonują sprawdzania błędów i powodują
wyjątki jeśli jest jakiś problem.
- dump ETYKIETA
- Powoduje to natychmiastowy zrzut core. Jest to po to,
byś mógł użyć programu undump do
konwertowania zrzutu core do pliku binarnego po zainicjalizowaniu
wszystkich zmiennych z początku programu. Po uruchomieniu nowego
binarium, rozpocznie się ono od wywołania goto ETYKIETA (ze
wszystkimi ograniczeniami, na które cierpi goto). Myśl o tym,
jak o goto z interweniującym zrzutem core i reinkarnacją.
Jeśli ETYKIETA jest pominięta, program restartuje się od
początku. UWAGA: wszelkie pliki, które były otwarte w
momencie zrzutu core nie będą otwarte w nowej inkarnacji
programu, powodując przypuszczalnie zamieszanie w części
perla. Zobacz też opcję -u ze strony perlrun(1).
Przykład:
#!/usr/bin/perl
require 'getopt.pl';
require 'stat.pl';
%days = (
'Sun' => 1,
'Mon' => 2,
'Tue' => 3,
'Wed' => 4,
'Thu' => 5,
'Fri' => 6,
'Sat' => 7,
);
dump QUICKSTART if $ARGV[0] eq '-d';
QUICKSTART:
Getopt('f');
- each HASH
- Po wywołaniu w kontekście listowym, zwraca
dwuelementową tablicę, składającą się z
klucza i wartości następnego elementu asocjacyjnego, tak że
możesz iterować poprzez tablicę. Po wywołaniu w
kontekście skalarnym, zwraca tylko klucz dla następnego elementu
asocjacyjnego. (Uwaga: Klucze mogą mieć wartość
"0" lub "", co jest logicznie nieprawidłowe;
możesz w tym celu chcieć zapobiec konstrukcjom jak while ($k =
each %foo) {} .)
Wpisy są zwracane w kolejności dość losowej. Gdy tablica
asocjacyjna jest całkowicie odczytana, w kontekście listowym
zwracana jest tablica null (co po przypisaniu daje wartość FALSE
(0)), a w kontekście skalarnym zwracany jest undef. Następne
wywołanie each() po tym rozpocznie iterowanie od nowa. Dla
każdej tablicy asocjacyjnej istnieje pojedynczy iterator, dzielony
przez funkcje each(), keys() i values(); może
być zresetowany przez odczytanie wszystkich elementów tablicy
lub przez wywołanie keys HASH lub values HASH. Jeśli dodajesz,
lub kasujesz elementy tablicy asocjacyjnej podczas jej iterowania, to
może się zdarzyć, że niektóre wpisy utracisz, a
niektóre dostaniesz zduplikowane. Nie rób więc tego.
Następujący przykład drukuje środowisko, podobnie jak
program printenv(1), lecz w odwrotnej kolejności:
while (($key,$value) = each %ENV) {
print "$key=$value\n";
}
Zobacz też keys() i values().
- eof UCHWYTPLIKU
-
- eof ()
-
- eof
- Zwraca 1, jeśli następny odczyt z UCHWYTUPLIKU
zwróci koniec pliku (eof) lub jeśli UCHWYTPLIKU nie jest
otwarty. UCHWYTPLIKU może być wyrażeniem, którego
wartość daje prawdziwą nazwę uchwytu pliku.
(Zauważ, że ta funkcja w rzeczywistości odczytuje znak, a
potem wstawia go z powrotem, więc nie jest zbyt użyteczna w
kontekście interaktywnym.) Nie czytaj z pliku terminalowego (lub nie
wołaj eof(UCHWYTPLIKU)) po osiągnięciu końca pliku.
Pliki takie, jak terminale mogą po takim zabiegu utracić warunek
końca pliku.
eof bez argumentów, używa jako argumentu ostatniego odczytu pliku.
Puste nawiasy () mogą wskazywać na pseudo plik,
złożony z plików, wymienionych w linii komend, np. eof()
dobrze jest używać wewnątrz pętli while (<>),
aby wykryć koniec ostatniego pliku. Przykłady:
# resetuj numerowanie linii dla każdego pliku wejściowego
while (<>) {
print "$.\t$_";
close(ARGV) if (eof); # Nie eof().
}
# wstaw kreski przed ostatnią linią ostatniego pliku
while (<>) {
if (eof()) {
print "--------------\n";
close(ARGV); # close or break; is needed if we
# are reading from the terminal
}
print;
}
Wskazówka praktyczna: w perlu prawie nigdy nie trzeba używać
eof, ponieważ operatory wejściowe zwracają undef gdy nie
będą miały więcej danych.
- eval WYRAŻ
-
- eval BLOK
- WYRAŻ jest przetwarzany i wykonywany tak, jakby
był maleńkim programem perla. Jest wywoływany w
kontekście bieżącego programu perla, więc wszelkie
ustawienia zmiennych lub definicje podprocedur i formatów
zostają dalej. Zwracana wartość jest wartością
ostatniego wykonanego wyrażenia, lub wartością,
przekazaną przez return, czyli tak jak w podprocedurach. Ostatnie
wyrażenie jest wykonywane w kontekście skalarnym, lub
tablicowym, zależnie od kontekstu eval.
Jeśli pojawi się błąd składni lub błąd
czasu działania albo jeśli wykonana zostanie instrukcja
die(), to zwrócona zostanie wartość niezdefiniowana,
a $@ zostanie ustawione na komunikat o błędzie. Jeśli nie
było błędu, $@ będzie łańcuchem null.
Jeśli WYRAŻ zostanie pominięte, to wykonywane jest $_.
Ostatni średnik, jeśli taki istnieje, może być
pominięty w wyrażeniu. Ostrzegam jednak, że używanie
eval() nie wycisza perla od drukowania ostrzeżeń na
STDERR, ani nie upycha tekstu tych komunikatów do $@. Aby zrobić
którąś z tych rzeczy, musisz użyć zabudowania
$SIG{__WARN__}. Zobacz warn() i stronę perlvar(1).
Zauważ, że ponieważ eval() przechwytuje krytyczne (w
innych wypadkach) błędy, to jest przydatny dla określania
czy konkretna właściwość (taka, jak np.
socket(), symlink(), itp. jest zaimplementowana. Jest to
również mechanizm perla obsługiwania wyjątków,
gdzie operator die jest mechanizmem ich podnoszenia.
Jeśli wykonywany kod się nie różni, możesz
użyć postaci eval-BLOK do wychwytywania błędów
czasu działania, bez potrzeby rekompilacji za każdym razem.
Błąd, jeśli się pojawi, jest wciąż zwracany
w $@. Przykłady:
# spowoduj, by dzielenie przez zero nie było krytyczne
eval { $answer = $a / $b; }; warn $@ if $@;
# to samo, mniej efektywnie
eval '$answer = $a / $b'; warn $@ if $@;
# błąd czasu kompilacji
eval { $answer = };
# błąd czasu działania
eval '$answer ='; # ustawia $@
Używając postaci eval{} jako pułapki na wyjątki w
bibliotekach, możesz nie życzyć sobie uruchamiania
haków __DIE__, które mógł sobie ustawić
użytkownik. Dla tego celu można wykorzystać
konstrukcję local $SIG{__DIE__}. Przykład:
# bardzo prywatna pułapka na wyjątek dzielenia przez zero
eval { local $SIG{'__DIE__'}; $answer = $a / $b; }; warn $@ if $@;
Jest to szczególnie istotne, gdyż haki __DIE__ mogą
wywoływać die() ponownie, co ma efekt zmieniania
komunikatów o błędach:
# haki __DIE__ mogą modyfikować komunikaty o błędach
{
local $SIG{'__DIE__'} = sub { (my $x = $_[0]) =~ s/foo/bar/g; die $x };
eval { die "foo foofs here" };
print $@ if $@; # drukuje "bar barfs here"
}
Używając eval(), powinieneś szczególnie
uważać, by pamiętać na co się patrzy gdy:
eval $x; # PRZYPADEK 1
eval "$x"; # PRZYPADEK 2
eval '$x'; # PRZYPADEK 3
eval { $x }; # PRZYPADEK 4
eval "\$$x++" # PRZYPADEK 5
$$x++; # PRZYPADEK 6
Przypadki 1 i 2 zachowują się jednakowo: uruchamiają kod,
zawarty w zmiennej $x. (Chociaż przypadek 2 ma ogłupiające
cudzysłowy, powodujące, że czytelnik zastanawia się,
co jeszcze może się zdarzyć (nic nie może).) Przypadki
3 i 4 zachowują się podobnie: wykonują one kod '$x',
który nie robi nic poza zwróceniem wartości $x. (Przypadek
4 jest preferowany ze względów estetycznych, ma też
zaletę kompilowania podczas kompilacji, a nie podczas
działania.) Przypadek 5 jest miejscem, gdzie normalnie
chciałbyś użyć cudzysłowów, poza tym,
że w tej konkretnej sytuacji można użyć po prostu
symbolicznych referencji. Jest tak w przypadku 6.
- exec LISTA
- Funkcja exec() wykonuje komendę systemową
i NIGDY NIE POWRACA, chyba że komenda nie istnieje i
jest wykonywana bezpośrednio, zamiast przez /bin/sh -c (patrz
niżej). Jeśli chcesz powrócić, użyj zamiast
exec() instrukcji system().
Jeśli w LIŚCIE jest więcej niż jeden argument, lub
jeśli jest to tablica z więcej niż jedną
wartością, wywoływany jest execvp(3) (z argumentami
z LISTY). Jeśli jest tylko jeden argument skalarny, to jest on
sprawdzany w poszukiwaniu metaznaków powłoki. Jeśli są
tam jakieś znaki, to cały argument jest przekazywany do
przetworzenia przez /bin/sh -c. Jeśli nie ma żadnych
metaznaków, to argument jest dzielony na słowa i przekazywany
bezpośrednio do execvp(3), co jest bardziej efektywne. Uwaga:
exec() i system() nie opróżniają twojego
bufora wejściowego, więc możliwe, że aby zapobiec
utracie wyjścia, będziesz musiał ustawić $⎪.
Przykłady:
exec '/bin/echo', 'Twoimi argumentami są: ', @ARGV;
exec "sort $outfile ⎪ uniq";
Jeśli tak naprawdę nie potrzebujesz wywołać pierwszego
argumentu, lecz chcesz oszukać program, który wykonujesz co do
jego nazwy, to możesz podać program, który chcesz
wywołać jako "obiekt niebezpośredni" (bez
przecinka) na samym początku LISTY. (Wymusza to zawsze
interpretację LISTY jako listy wielowartościowej, nawet
jeśli jest tam tylko pojedynczy skalar.) Przykład:
$shell = '/bin/csh';
exec $shell '-sh'; # udaj, że to powłoka loginowa
lub, bardziej bezpośrednio,
exec {'/bin/csh'} '-sh'; # udaj, że to powłoka loginowy
- exists WYRAŻ
- Zwraca TRUE, jeśli podany klucz asocjacyjny istnieje w
tablicy asocjacyjnej. Wartość jest prawdziwa nawet gdy
odpowiadająca kluczowi wartość jest niezdefiniowana.
print "Istnieje\n" if exists $array{$key};
print "Zdefiniowany\n" if defined $array{$key};
print "Prawdziwy\n" if $array{$key};
Element asocjacyjny może być prawdziwy tylko wtedy, gdy jest
zdefiniowany, a zdefiniowany jeśli istnieje, lecz odwrotna
kolejność niekoniecznie jest prawdziwa.
Zauważ, że WYRAŻ może być skomplikowany tak daleko,
dopóki ostateczna operacja jest podejrzeniem klucza asocjacyjnego:
if (exists $ref->[$x][$y]{$key}) { ... }
- exit WYRAŻ
- Wykonuje WYRAŻ i kończy pracę z tą
wartością. (W rzeczywistości, wywołuje najpierw
zdefiniowane procedury END, lecz procedury te mogą przerwać
kończenie. Podobnie, również przed wyjściem
wołane są wszelkie destruktory obiektów.) Przykład:
$ans = <STDIN>;
exit 0 if $ans =~ /^[Xx]/;
Zobacz też die(). Jeśli WYRAŻ jest pominięte, to
praca kończy się statusem 0. Jedynymi, uniwersalnymi i
przenośnymi wartościami WYRAŻ są 0 dla sukcesu i 1 dla
błędu; wszelkie inne są podstawą do dziwnych
interpretacji, zależnych od środowiska, w którym program
jest uruchomiony.
Nie powinieneś używać exit() do przerywania
podprocedury, jeśli istnieje szansa, że ktoś
mógłby chcieć ustawić pułapkę na
błąd. Zamiast tego użyj die(), który może
być przechwycony przez eval().
- exp WYRAŻ
-
- exp
- Zwraca e (naturalna podstawa logarytmu) do
potęgi WYRAŻ. Jeśli WYRAŻ jest pominięte, zwraca
exp($_).
- fcntl UCHWYTPLIKU,FUNKCJA,SKALAR
- Implementuje funkcję fcntl(2). Przypuszczalnie
będziesz musiał zaznaczyć
use Fcntl;
aby móc się nią posługiwać. Przetwarzanie
argumentów i zwracanie wartości działa zupełnie jak w
ioctl(), opisanym niżej. Zauważ, że fcntl()
da błąd krytyczny po użyciu na maszynie, nie
implementującej fcntl(2). Na przykład:
use Fcntl;
fcntl($filehandle, F_GETLK, $packed_return_buffer);
- fileno UCHWYTPLIKU
- Zwraca deskryptor pliku dla uchwytu pliku. Jest to
przydatne dla konstruowania bitmap dla select(). Jeśli
UCHWYTPLIKU jest wyrażeniem, to jego wartość brana jest za
nazwę uchwytu pliku.
- flock UCHWYTPLIKU,OPERACJA
- Wywołuje flock(2), lub emuluje go dla uchwytu
UCHWYTPLIKU. Zwraca TRUE po sukcesie, FALSE w wypadku jakiegoś
problemu. Na maszynach nie implementujących blokowania
flock(2), fcntl(2), lub lockf(3), powoduje
błąd krytyczny. flock() jest przenośnym perlowym
interfejsem blokowania plików, choć blokuje tylko całe
pliki, a nie rekordy.
OPERACJA jest jedną z LOCK_SH, LOCK_EX, lub LOCK_UN. Możliwa jest
jeszcze kombinacja z LOCK_NB. Stałe te mają tradycyjne
wartości 1, 2, 8 i 4, lecz możesz używać nazw
symbolicznych po zaimportowaniu ich z modułu Fcntl, robiąc to
albo pojedynczo, albo grupowo, używając tagu ':flock' . LOCK_SH
żąda blokady dzielonej, LOCK_EX żąda blokady na
wyłączność, a LOCK_UN zwalnia poprzednio
zażądaną blokadę. Jeśli do LOCK_SH lub LOCK_EX
dodany zostanie LOCK_NB, to flock nie będzie blokował,
oczekując na zablokowanie, lecz zakończy działanie
natychmiast (aby dowiedzieć się, czy uzyskałeś
blokadę, sprawdź status wyjścia).
Aby zapobiec prawdopodobnie dekoordynacji, perl opróżnia
UCHWYTPLIKU przed jego (od)blokowaniem.
Zauważ, że emulacja zbudowana za pomocą lockf(3) nie
daje blokad dzielonych i wymaga, by UCHWYTPLIKU był otwarty z
zamiarem zapisu. Jest to semantyka, którą implementuje
lockf(3). Większość (wszystkie?) systemów
jednak implementuje lockf(3) na zasadach blokowania
fcntl(2), więcej różnice nie powinny się
dawać we znaki.
Zauważ też, że niektóre wersje flock() nie
mogą blokować rzeczy poprzez sieć; będziesz
musiał użyć do tego bardziej specyficznego dla systemu
fcntl(). Jeśli chcesz, możesz zmusić perla do
ignorowania systemowej funkcji flock(2) i używać jego
własnej, opartej o fcntl(2) emulacji. Robi się to,
podając programowi Configure przełącznik -Ud_flock.
Trzeba to oczywiście zrobić podczas konfigurowania perla jako
takiego.
Oto doklejacz mailboxa dla systemów BSD.
use Fcntl ':flock'; # importuj stałe LOCK_*
sub lock {
flock(MBOX,LOCK_EX);
# a w wypadku, gdyby ktoś dokleił
# podczas naszego oczekiwania...
seek(MBOX, 0, 2);
}
sub unlock {
flock(MBOX,LOCK_UN);
}
open(MBOX, ">>/usr/spool/mail/$ENV{'USER'}")
or die "Nie mogę otworzyć mailboxa!: $!";
lock();
print MBOX $msg,"\n\n";
unlock();
Zobacz też stronę podręcznika. Są tam inne
przykłady flock().
- fork
- Wykonuje wywołanie systemowe fork(2). Zwraca
procesowi rodzicielskiemu pid dziecka, a w wątku dziecka zwraca zero.
W wypadku błędu, zwraca undef. Uwaga: nieopróżnione
bufory pozostają nieopróżnione w obydwu procesach, co
znaczy, że będziesz musiał ustawić $⎪
($AUTOFLUSH w English) lub wywołać metodę
autoflush() z IO::Handle aby zapobiec duplikacji wyjścia.
Jeśli fork()'ujesz bez czekania na dzieci, zbierzesz zombies.
(Osierocone procesy.)
$SIG{CHLD} = sub { wait };
Istnieje też trik podwójnego forka (sprawdzanie
błędów forka zostało pominięte);
unless ($pid = fork) {
unless (fork) {
exec "co naprawdę chcesz robić";
die "bez exec";
# ... or ...
## (jakiś_kod_perla)
exit 0;
}
exit 0;
}
waitpid($pid,0);
Zobacz też stronę podręcznika perlipc(1). Są tam
dalsze przykłady forkowania i zbierania konających dzieci.
Zauważ, że jeśli twoje forkowane dziecko dziedziczy systemowe
deskryptory plików, takie jak STDIN i STDOUT, które w
rzeczywistości są połączone potokiem lub gniazdem, to
jeśli skończysz działanie, zdalny serwer (taki jak httpd,
rsh) nie będzie myślał, że rzeczywiście
skończyłeś. Powinieneś je otworzyć na nowo na
/dev/null.
- format
- Zadeklaruj format obrazka, używanego z funkcją
write(). Na przykład:
format Something =
Test: @<<<<<<<< @⎪⎪⎪⎪⎪ @>>>>>
$str, $%, '$' . int($num)
.
$str = "widget";
$num = $cost/$quantity;
$~ = 'Something';
write;
Dla dalszych opisów i przykładów, zobacz stronę
perlform(1).
- formline OBRAZEK,LISTA
- Jest to funkcja wewnętrzna, używana przez
formaty. Można ją jednak wywołać też
samodzielnie. Formatuje ona (zobacz stronę perlform(1))
listę wartości zależnie od zawartości OBRAZKA,
umieszczając wyjście w akumulatorze wyjścia formatowego,
$^A ($ACCUMULATOR w English). Ostatecznie, po dokonaniu write(),
zawartość $^A jest zapisywana do jakiegoś uchwytu pliku.
Możesz jednak odczytać go samodzielnie i ustawić na
"". Zauważ, że format zazwyczaj wykonuje jeden
formline() na każdą linię formy, lecz sama funkcja
fromline nie zwraca uwagi na to, ile nowych linii jest osadzonych w
OBRAZKU. Znaczy to, że tokeny ~ i ~~ będą traktować
cały OBRAZEK jako linię pojedynczą. Możesz więc
być zmuszonym do używania wielu linii form, aby
zaimplementować pojedynczy format zapisu, podobnie jak kompilator
format.
Uważaj, jeśli wstawiasz wokół obrazka podwójne
cudzysłowy--znak "@" może być wzięty za
początek nazwy tablicy. formline() zawsze zwraca TRUE. Zobacz
stronę perlform(1) dla dalszych przykładów.
- getc UCHWYTPLIKU
-
- getc
- Zwraca następny znak z pliku wejściowego,
identyfikowanego przez UCHWYTPLIKU. Na końcu pliku zwraca
łańcuch null. Jeśli UCHWYTPLIKU zostanie pominięty,
odczyt następuje ze STDIN. Nie jest to efektywne. Nie może
być używane do pobierania niebuforowanych pojedynczych
znaków. Do tego celu spróbuj raczej czegoś w rodzaju:
if ($BSD_STYLE) {
system "stty cbreak </dev/tty >/dev/tty 2>&1";
}
else {
system "stty", '-icanon', 'eol', "\001";
}
$key = getc(STDIN);
if ($BSD_STYLE) {
system "stty -cbreak </dev/tty >/dev/tty 2>&1";
}
else {
system "stty", 'icanon', 'eol', '^@'; # ASCII null
}
print "\n";
Określenie, czy $BSD_STYLE powinno być ustawione, pozostawiamy
jako ćwiczenie dla czytelnika.
Na systemach, kompatybilnych z POSIX, bardziej przenośna do tego celu
może być funkcja POSIX::getattr(). Zobacz też
moduł Term::ReadKey z najbliższego mirrora CPAN;
szczegóły o CPAN można znaleźć we wpisie CPAN ze
strony podręcznika perlmod(1).
- getlogin
- Zwraca bieżący login z /etc/utmp. (o ile
istnieje.) W wypadku nulla, użyj getpwuid().
$login = getlogin ⎪⎪ getpwuid($<) ⎪⎪ "Kilroy";
Nie wykorzystuj getlogin() do autentykacji: nie jest tak bezpieczny
jak getpwuid().
- getpeername GNIZADO
- Zwraca spakowany adres sockaddr drugiego końca z
połączenia na GNIEŹDZIE.
use Socket;
$hersockaddr = getpeername(SOCK);
($port, $iaddr) = unpack_sockaddr_in($hersockaddr);
$herhostname = gethostbyaddr($iaddr, AF_INET);
$herstraddr = inet_ntoa($iaddr);
- getpgrp PID
- Zwraca bieżącą grupę procesu dla
podanego PIDa. Aby uzyskać grupę bieżącego procesu,
użyj wartości PID równej zero. Użycie tej funkcji na
maszynie, nie implementującej getpgrp(2) podniesie
wyjątek. Jeśli parametr PID zostanie pominięty, to zwracana
jest grupa bieżącego procesu. Zauważ, że wersja POSIX
getpgrp nie przyjmuje argumentu PID, więc naprawdę
przenośna jest tylko konstrukcja PID==0.
- getppid
- Zwraca identyfikator procesu rodzicielskiego.
- getpriority CZYJE,KTO
- Zwraca bieżący priorytet procesu, grupy
procesów, lub użytkownika. (Zobacz stronę podręcznika
getpriority(2).) Użycie tej funkcji na maszynie nie
implementującej getpriority(2) podniesie wyjątek
krytyczny.
- getpwnam NAZWA
-
- getgrnam NAZWA
-
- gethostbyname NAZWA
-
- getnetbyname NAZWA
-
- getprotobyname NAZWA
-
- getpwuid UID
-
- getgrgid GID
-
- getservbyname NAZWA,PROTO
-
- gethostbyaddr ADR,TYPADRESU
-
- getnetbyaddr ADR,TYPADRESU
-
- getprotobynumber LICZBA
-
- getservbyport PORT,PROTO
-
- getpwent
-
- getgrent
-
- gethostent
-
- getnetent
-
- getprotoent
-
- getservent
-
- setpwent
-
- setgrent
-
- sethostent STAYOPEN
-
- setnetent STAYOPEN
-
- setprotoent STAYOPEN
-
- setservent STAYOPEN
-
- endpwent
-
- endgrent
-
- endhostent
-
- endnetent
-
- endprotoent
-
- endservent
- Funkcje te dokonują tych samych akcji, co ich
odpowiedniki z biblioteki systemowej. W kontekście listowym,
wartości zwracane różnych funkcji `get' są
następujące:
($nazwa,$hasło,$uid,$gid,
$quota,$komentarz,$gcos,$katalog,$shell) = getpw*
($nazwa,$hasło,$gid,$członkowie) = getgr*
($nazwa,$aliasy,$typadresu,$długość,@addrs) = gethost*
($nazwa,$aliasy,$typadresu,$sieć) = getnet*
($nazwa,$aliasy,$protokół) = getproto*
($nazwa,$aliasy,$port,$protokół) = getserv*
(Jeśli wpis nie istnieje, dostaniesz listę null.)
W kontekście skalarnym, dostajesz nazwę. Wyjątkiem jest
funkcja podglądania według nazwy, gdzie dostajesz inną
rzecz, jaką by ona nie była. (Jeśli wpis nie istnieje,
otrzymujesz wartość niezdefiniowaną.) Na przykład:
$uid = getpwnam
$nazwa = getpwuid
$nazwa = getpwent
$gid = getgrnam
$nazwa = getgrgid
$nazwa = getgrent
itd.
Wartość $członkowie, zwracana przez getgr*() to
oddzielona spacjami lista nazw loginowych członków grupy.
Jeśli w C obsługiwana jest zmienna errno, to dla funkcji
gethost*() jego wartość będzie przekazywana przez
$?. Wartość @addrs, zwracana przez wykonane wywołanie, jest
listą czystych (raw) adresów, zwróconych przez odpowiednie
wywołanie systemowe. W domenie internetowej, każdy adres jest
czterobajtowy, a rozpakować go możesz, mówiąc coś
w rodzaju:
($a,$b,$c,$d) = unpack('C4',$addr[0]);
- getsockname GNIAZDO
- Zwraca spakowany adres sockaddr tego końca
połączenia na GNIEŹDZIE.
use Socket;
$mysockaddr = getsockname(SOCK);
($port, $myaddr) = unpack_sockaddr_in($mysockaddr);
- getsockopt GNIAZDO,POZIOM,NAZWAOPCJI
- Zwraca zażądaną opcję gniazda, lub
wartość niezdefiniowaną w wypadku błędu.
- glob WYRAŻ
-
- glob
- Zwraca wartość WYRAŻ z rozwinięciami
nazwy plików, takimi jakich dokonałaby powłoka. Funkcja ta
jest wewnętrzną funkcją implementującą operator
<*.c>, lecz możesz jej użyć bezpośrednio.
Jeśli pominięte zostanie WYRAŻ, to używane będzie
$_. Operator <*.c> jest omówiony bliżej w sekcji I/O
Operators na stronie perlop(1).
- gmtime WYRAŻ
- Konwertuje czas zwrócony przez funkcję time do 9
elementowej tablicy, w której znajduje się czas zlokalizowany do
standardowej strefy Greenwich. Zazwyczaj jest to używane
następująco:
# 0 1 2 3 4 5 6 7 8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
gmtime(time);
Wszystkie elementy tablicy są numeryczne i pochodzą wprost ze
struktury tm. Ogólnie znaczy to, że $mon ma zakres 0..11, a
$wday 0..6, z niedzielą kryjącą się pod 0. Dodatkowo,
$year jest liczbą lat od 1900, a nie po prostu dwiema
ostatnimi cyframi roku.
Jeśli WYRAŻ jest pominięte, wykonuje gmtime(time()).
W kontekście skalarnym, zwraca wartość ctime(3):
$now_string = gmtime; # np. "Thu Oct 13 04:54:34 1994"
Zobacz też funkcję timegm(), udostępnianą przez
moduł Time::Local, a także funkcję strftime(3),
dostępną przez moduł POSIX.
- goto ETYKIETA
-
- goto WYRAŻ
-
- goto &NAZWA
- Postać goto-ETYKIETA szuka instrukcji, oznaczonej
przez ETYKIETA i kontynuuje działanie od tamtego miejsca. Nie
może być używane do przechodzenia do konstrukcji,
wymagającej inicjalizacji, takiej jak podprocedura czy pętla
foreach. Nie może też być używane do przechodzenia do
konstrukcji optymalizowanej, lub do wychodzenia z bloku, lub podprocedury,
przekazanej do sort(). Można nim natomiast przeskoczyć
prawie we wszystkie inne miejsca zakresu dynamicznego,
włączając wychodzenie z podprocedur, choć w tym
wypadku lepiej użyć innej konstrukcji, takiej jak last lub die.
Autor perla nigdy nie czuł potrzeby używania tej postaci goto
(tzn. w perlu--C jest inną sprawą).
Postać goto-WYRAŻ oczekuje nazwy etykiety, której zakres
może być rozwiązany dynamicznie. Pozwala to na obliczane
goto per FORTRAN, lecz nie jest zbyt zalecane, jeśli optymalizujesz
ze względu na łatwość konserwacji programu:
goto ("FOO", "BAR", "GLARCH")[$i];
Postać goto-&NAZWA jest bardzo magiczna i podmienia wywołanie
do nazwanej podprocedury dla bieżącej procedury. Jest to
używane przez podprocedury AUTOLOAD, które chcą
ładować inne podprocedury, a potem udawać, że ta inna
podprocedura została wywołana jako pierwsza (poza tym, wszelkie
zmiany @_ bieżącej podprocedury są przekazywane innej
podprocedurze.) Po tym goto, nawet caller() nie będzie w
stanie powiedzieć, że ta procedura była wywołana
pierwsza.
- grep BLOK LISTA
-
- grep WYRAŻ,LISTA
- Jest to podobne duchowo, lecz nie identyczne do
grep(1) i krewnych. W rzeczywistości, nie jest ograniczone do
używania wyrażeń regularnych.
Wykonuje BLOK lub WYRAŻ dla każdego elementu LISTY
(ustawiając lokalnie $_ na każdy element) i zwracając
listę wartości, składających się z tych, dla
których wykonane wyrażenie było prawdziwe. W
kontekście skalarnym, zwraca liczbę prawdziwych
wyrażeń.
@foo = grep(!/^#/, @bar); # Pozbądź się komentarzy
lub równoważnie,
@foo = grep {!/^#/} @bar; # pozbądź się komentarzy
Zauważ, że skoro $_ jest referencją do wartości listy,
może być używane do modyfikowania elementów tablicy.
Podczas gdy jest to przydatne i obsługiwane, może to
spowodować też nieoczekiwane rezultaty, szczególnie w
wypadku gdy LISTA nie jest nazwaną tablicą.
Grep zwraca aliasy do oryginalnej listy. Znaczy to, że modyfikowanie
elementu listy zwróconej przez to polecenie, modyfikuje też
element listy oryginalnej.
- hex WYRAŻ
-
- hex
- Interpretuje WYRAŻ jako łańcuch szesnastkowy
i zwraca odpowiadającą mu wartość. (Dla konwersji
łańcuchów, które mogą się zaczynać od
0, lub 0x, zobacz opis oct, znajdujący się gdzieś w tym
dokumencie.) Jeśli WYRAŻ zostanie pominięte, to
używane jest $_.
print hex '0xAf'; # drukuje '175'
print hex 'aF'; # to samo
- import
- Nie istnieje wbudowana funkcja import. Jest to
zwyczajna metoda (podprocedura), definiowana (dziedziczona) przez
moduły, które życzą sobie eksportować nazwy do
kolejnych modułów. [potem] funkcja use() woła metodę
import() dla używanego pakietu. Zobacz jeszcze opis use() i
stronę perlmod(1) oraz stronę Exporter.
- index STR,SUBSTR,POZYCJA
-
- index STR,SUBSTR
- Zwraca pozycję pierwszego pojawienia się SUBSTR w
łańcuchu STR. Jeśli POZYCJA jest pominięta, to
przeszukiwanie rozpoczyna się od początku łańcucha.
Wartość zwracana jest oparta o 0 (lub tego, na co ustawisz
zmienną $[ --lecz lepiej tego nie rób). Jeśli podciąg
nie może zostać zlokalizowany, zwracana jest podstawa - 1, czyli
normalnie -1.
- int WYRAŻ
-
- int
- Zwraca część całkowitą z
WYRAŻ. Jeśli WYRAŻ jest pominięte, używane jest
$_.
- ioctl UCHWYTPLIKU,FUNKCJA,SKALAR
- Implementuje funkcję ioctl(2). Przypuszczalnie
aby jej używać, będziesz musiał powiedzieć
require "ioctl.ph"; # przypuszczalnie w /usr/local/lib/perl/ioctl.ph
Jeśli ioctl.ph nie istnieje, lub nie ma właściwych
definicji, będziesz musiał użyć swojej własnej,
opartej na nagłówkach C, takich jak <sys/ioctl.h>.
(Istnieje skrypt perla o nazwie h2ph(1), która pomaga w
konwersji, lecz jest to nietrywialna sprawa.) SKALAR jest
wartością zapisywaną, lub odczytywaną, zależnie
od FUNKCJI--wskaźnik do wartości łańcuchowej SKALARA
będzie przekazany jako trzeci argument właściwego
wywołania ioctl. (Jeśli SKALAR nie ma wartości
łańcuchowej, lecz ma numeryczną, to zostanie przekazana ta
wartość zamiast wskaźnika do łańcucha. Aby
zapewnić, że będzie to prawdziwe, przed użyciem dodaj
do skalara 0). Do manipulowania na wartościach struktur,
używanych przez ioctl() przydatne są funkcje
pack() i unpack(). Następujący przykład
ustawia znak kasowania na DEL.
require 'ioctl.ph';
$getp = &TIOCGETP;
die "NO TIOCGETP" if $@ ⎪⎪ !$getp;
$sgttyb_t = "ccccs"; # 4 znaki i short
if (ioctl(STDIN,$getp,$sgttyb)) {
@ary = unpack($sgttyb_t,$sgttyb);
$ary[2] = 127;
$sgttyb = pack($sgttyb_t,@ary);
ioctl(STDIN,&TIOCSETP,$sgttyb)
⎪⎪ die "Nie mogę wykonać ioctl: $!";
}
Wartość zwracana ioctl (i fcntl) jest następująca:
gdy OS zwraca: to Perl zwraca:
-1 wartość niezdefiniowaną
0 łańcuch "0 but true"
coś innego to samo
Tak więc, mimo że perl zwraca po sukcesie TRUE, a w wypadku
niepowodzenia FALSE, możesz łatwo określić
rzeczywistą wartość zwróconą przez system
operacyjny:
($retval = ioctl(...)) ⎪⎪ ($retval = -1);
printf "System zwrócił %d\n", $retval;
- join WYRAŻ,LISTA
- Łączy osobne łańcuchy LISTY w
pojedynczy łańcuch, w którym pola są rozdzielone
wartościami WYRAŻ. Zwraca ten łańcuch. Przykład:
$_ = join(':', $login,$passwd,$uid,$gid,$gcos,$home,$shell);
Zobacz też opis split.
- keys HASH
- Zwraca normalna tablicę, składającą
się z wszystkich kluczy nazwanej tablicy asocjacyjnej. (W
kontekście skalarnym, zwraca liczbę kluczy.) Klucze są
zwracane w dość losowej kolejności, lecz w tej samej, w
której swoje wartości produkują funkcje values() i
each() (o ile tablica asocjacyjna nie była [w
międzyczasie] zmieniana). W efekcie ubocznym, funkcja resetuje
iterator tablicy.
A oto jeszcze inny sposób na wydrukowanie środowiska:
@keys = keys %ENV;
@values = values %ENV;
while ($#keys >= 0) {
print pop(@keys), '=', pop(@values), "\n";
}
a co, jeśli by je posortować według klucza:
foreach $key (sort(keys %ENV)) {
print $key, '=', $ENV{$key}, "\n";
}
Aby posortować tablicę według wartości, będziesz
musiał użyć funkcji sort. Oto numeryczne posortowanie
tablicy asocjacyjnej według jej wartości:
foreach $key (sort { $hash{$b} <=> $hash{$a} } keys %hash)) {
printf "%4d %s\n", $hash{$key}, $key;
}
Jako lwartość, keys umożliwia zwiększanie liczby
komórek asocjacyjnych, zaalokowanych dla danej tablicy asocjacyjnej.
Możesz zyskać na efektywności, jeśli tablica ma
być duża. (Jest to podobne do pre-rozszerzania tablicy przez
przeznaczanie $#array większego numeru.) Jeśli powiesz
keys %hash = 200;
to %hash będzie miał co najmniej 200 zaalokowanych komórek.
Komórki te będą utrzymywane nawet, jeśli zrobisz %hash
= (). Jeśli chcesz zwolnić zasób wewnątrz zakresu,
użyj undef %hash. Korzystając z powyższej
właściwości, zawsze można zmniejszyć liczbę
zaalokowanych komórek.
- kill LISTA
- Wysyła sygnał do listy procesów. Pierwszy
element listy musi być nazwą sygnału. Zwraca liczbę
procesów, do których udało się przesłać
sygnał.
$cnt = kill 1, $child1, $child2;
kill 9, @goners;
W przeciwieństwie do zachowania w powłoce, w perlu jeśli
-1SYGNAŁ jest ujemny, to killuje grupy procesów, zamiast
procesów. (W Systemie V, ujemny numer PROCESU odnosi się
też do grup procesów, lecz nie jest to przenośne.) Oznacza
to, że zazwyczaj chcesz przekazywać sygnały dodatnie.
Możesz też używać nazw sygnałów w
cudzysłowach. Zobacz jeszcze sekcję Signals w
podręczniku perlipc(1).
- last ETYKIETA
-
- last
- Komenda last jest podobna do instrukcji break z C
(używanej w pętlach); przerywa natychmiastowo pętlę.
Jeśli pominięty jest parametr ETYKIETY, to komenda odnosi
się do najbardziej wewnętrznej pętli zamykającej.
Potencjalna instrukcja bloku continue nie jest wykonywana:
LINE: while (<STDIN>) {
last LINE if /^$/; # zakończ po skończeniu z nagłówkiem
...
}
- lc WYRAŻ
-
- lc
- Zwraca WYRAŻ w małych literach. Jest to
wewnętrzna funkcja, implementująca escape \L w
łańcuchach ujętych w cudzysłowy. Jeśli
włączone jest use locale, to szanuje bieżące locale
LC_CTYPE. Zobacz stronę podręcznika perllocale(1).
Jeśli WYRAŻ jest pominięte, używane jest $_.
- lcfirst WYRAŻ
-
- lcfirst
- Zwraca wartość WYRAŻ, w którym pierwszy
znak jest zastąpiony małą literą. Jest to funkcja
wewnętrzna, implementująca escape \l w łańcuchach
ujętych w podwójne cudzysłowy. Jeśli
włączone jest use locale, to szanuje bieżące locale
LC_CTYPE. Zobacz stronę podręcznika perllocale(1).
Jeśli WYRAŻ jest pominięte, używane jest $_.
- length WYRAŻ
-
- length
- Zwraca długość w znakach wartości
WYRAŻ. Jeśli WYRAŻ jest pominięte, zwracana jest
długość $_.
- link STARYPLIK,NOWYPLIK
- Tworzy nową nazwę pliku, dowiązaną do
starej nazwy pliku. Po sukcesie zwraca 1, a w przeciwnym wypadku 0.
- listen GNIAZDO,ROZMIARKOLEJKI
- Robi to samo, co wywołanie systemowe listen(2). Zwraca
TRUE po sukcesie, a w przeciwnym wypadku FALSE. Zobacz przykład w
sekcji Sockets: Client/Server Communication w podręczniku
perlipc(1).
- local WYRAŻ
- Local modyfikuje wymienione zmienne tak, że są
lokalne w otaczającym je bloku, podprocedurze, eval{}, lub do.
Jeśli wymieniona jest więcej niż jedna wartość,
to lista musi być umieszczona w nawiasach. Zobacz sekcję
Temporary Values via local() w podręczniku perlsub(1).
Zamiast local(), często raczej wolałbyś użyć
my(), gdyż to pierwsze tak naprawdę nie jest tym czym
się większości ludzi wydaje. Odsyłam do sekcji
Private Variables via my() w podręczniku perlsub(1).
- localtime WYRAŻ
- Konwertuje czas, zwrócony przez funkcję time na
9-elementową tablicę, której czas jest zanalizowany dla
lokalnej strefy czasowej. Zazwyczaj jest to używane
następująco:
# 0 1 2 3 4 5 6 7 8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);
Wszystkie elementy tablicy są numeryczne i pochodzą wprost ze
struktury tm. W rzeczywistości znaczy to, że $mon ma zasięg
0..11, a $wday 0..6, gdzie 0 oznacza niedzielę. Poza tym, $year jest
liczbą lat ot 1900 roku, tj. rok 123 oznacza 2023.
Jeśli WYRAŻ zostanie pominięte, to używany jest czas
bieżący (localtime(time)).
W kontekście skalarnym, zwraca wartość ctime(3):
$now_string = localtime; # np., "Thu Oct 13 04:54:34 1994"
Zobacz też moduł Time::Local i funkcje strftime(3) i
mktime(3), dostępne przez moduł POSIX.
- log WYRAŻ
-
- log
- Zwraca logarytm (podstawa e) z WYRAŻ.
Jeśli WYRAŻ jest pominięte, zwraca wartość dla
$_.
- lstat UCHWYTPLIKU
-
- lstat WYRAŻ
-
- lstat
- Robi to samo, co funkcja stat(), lecz zamiast
plików, na które wskazują dowiązania symboliczne,
testuje same dowiązania. Jeśli twój system nie
obsługuje dowiązań symbolicznych, dokonywany jest
zwykły stat().
Jeśli WYRAŻ jest pominięte, używane jest $_.
- m//
- Operator porównania. Zobacz stronę
perlop(1).
- map BLOK LISTA
-
- map WYRAŻ,LISTA
- Analizuje BLOK lub WYRAŻ dla każdego elementu
LISTY (ustawiając lokalnie $_ na każdy element) i zwraca
wartość listową, złożoną z wyników
każdego analizowania. BLOK lub WYRAŻ jest analizowany w
kontekście listowym, więc każdy element LISTY może
dać zero, jeden, lub więcej elementów w wartości
zwracanej.
@chars = map(chr, @nums);
tłumaczy listę liczb na odpowiadające im znaki. A
%hash = map { getkey($_) => $_ } @array;
jest tylko śmiesznym sposobem zapisania
%hash = ();
foreach $_ (@array) {
$hash{getkey($_)} = $_;
}
- mkdir NAZWAPLIKU,PRAWA
- Tworzy katalog, podany jako NAZWAPLIKU, którego prawa
są określone przez PRAWA (zmodyfikowane przez umaskę).
Jeśli operacja zakończy się sukcesem, zwraca 1, w
przeciwnym wypadku zwraca 0 i ustawia $! (errno).
- msgctl ID,CMD,ARG
- Woła funkcję IPC msgctl(2) z Systemu V.
Jeśli CMd jest &IPC_STAT, to ARG musi być zmienną,
która będzie przechowywać zwróconą strukturę
msquid_ds. Wartość zwracana tej funkcji jest podobna do ioctl:
dla błędu wartość niezdefiniowana, "0 but
true" dla zera, oraz rzeczywista wartość zwracana dla
innych wypadków.
- msgget KLUCZ,FLAGI
- Woła funkcję IPC msgget(2) z Systemu V.
Zwraca identyfikator kolejki komunikatów, lub wartość
niezdefiniowaną (w wypadku błędu).
- msgsnd ID,MSG,FLAGI
- Woła funkcję IPC msgsnd(2) z Systemu V,
która przesyła komunikat MSG do kolejki komunikatów ID. MSG
musi zaczynać się wartością long int,
określającą typ, którą można utworzyć z
pomocą pack("l",$typ). Zwraca TRUE po sukcesie i FALSE w
wypadku błędu.
- msgrcv ID,VAR,ROZMIAR,TYP,FLAGI
- Woła funkcję IPC msgrcv(2) z Systemu V.
Funkcja odbiera komunikat z kolejki komunikatów ID i zapisuje go do
zmiennej VAR. Maksymalna odbierana wiadomość ma
wielkość ROZMIAR. Zauważ, że gdy wiadomość
jest odbierana, to jej typ będzie pierwszą rzeczą,
lądującą w VAR, a maksymalna długość VAR to
ROZMIAR plus rozmiar typu komunikatu. Zwraca TRUE po sukcesie, a FALSE w
wypadku błędu. [przyp.tłum.: pole TYPE generalnie w IPC
oznacza typ, zdefiniowany w pierwszych 4 bajtach komunikatu]
- my WYRAŻ
- Instrukcja "my" deklaruje wymienione zmienne jako
lokalne dla zamkniętego bloku, podprocedury, eval lub pliku
potraktowanego instrukcjami do/require/use. Jeśli wymieniono
więcej niż jedną wartość, lista musi być
ujęta w nawiasy. Zobacz jeszcze sekcję Private Variables via
my() w podręczniku perlsub(1).
- next ETYKIETA
-
- next
- Komenda next jest podobna do instrukcji continue w C;
rozpoczyna kolejną iterację pętli:
LINE: while (<STDIN>) {
next LINE if /^#/; # pozbądź się komentarzy
...
}
Zauważ, że jeśli powyżej był blok continue, to
zostałby on wykonany nawet na usuniętych liniach. Jeśli
argument ETYKIETY jest pominięty, komenda odnosi się do
najbardziej wewnętrznej otaczającej pętli.
- no Module LISTA
- Zobacz funkcję "use", gdzie "no"
jest przeciwieństwem.
- oct WYRAŻ
-
- oct
- Interpretuje WYRAŻ jako łańcuch
ósemkowy i zwraca odpowiadającą wartość.
(Jeśli WYRAŻ zaczyna się od 0x, jest interpretowane jako
łańcuch szesnastkowy.) Następujący kod obsługuje
liczby dziesiętne, ósemkowe i szesnastkowe w standardowej
notacji perla lub C:
$val = oct($val) if $val =~ /^0/;
Jeśli WYRAŻ jest pominięte, używa $_. Funkcja ta jest
często używana gdy łańcuch w rodzaju "644"
musi być np. przekonwertowany na prawa pliku. (Chociaż perl
automatycznie konwertuje łańcuchy na liczby, zgodnie z
potrzebami, to automatyczna konwersja zakłada podstawę 10.)
- open UCHWYTPLIKU,WYRAŻ
-
- open UCHWYTPLIKU
- Otwiera plik, którego nazwa jest przekazywana
WYRAŻ, a następnie wiąże go z UCHWYTEMPLIKU.
Jeśli UCHWYTPLIKU jest wyrażeniem, to jego wartość
jest używana jako nazwa rzeczywistego uchwytu pliku. Jeśli
WYRAŻ jest pominięte, to przyjmuje się, że zmienna
skalarna o tej samej nazwie co UCHWYTPLIKU zawiera nazwę pliku.
(Zauważ, że zmienne leksykalne--te, deklarowane z pomocą
my--nie będą w ten sposób działały.)
Jeśli nazwa pliku rozpoczyna się od '<' lub od niczego, plik
jest otwierany dla wejścia (odczytu). Jeśli nazwa pliku
rozpoczyna się od '>', plik jest kasowany i otwierany dla zapisu.
Jeśli nazwa pliku rozpoczyna się od '>>', plik jest
otwierany dla dopisywania. Jeśli przed '>' lub '<' postawisz
'+', oznacza to, że chcesz zarówno czytać, jak i
zapisywać do pliku. Tryb '+<' jest zazwyczaj preferowany dla
poprawek odczytu/zapisu--tryb '+>' najpierw pobiłby plik.
Przedrostek i nazwa pliku mogą być oddzielone spacjami.
Wszystkie te przedrostki odpowiadają trybom otwarcia funkcji
fopen(3).
Jeśli nazwa pliku rozpoczyna się od "⎪", to plik
jest rozumiany jako komenda, do której potokiem przesyłane jest
wyjście. Odwrotnie, jeśli nazwa pliku kończy się tym
symbolem, to nazwa pliku jest interpretowana jako komenda, której
wyjście jest przesyłane potokiem na nasze wejście (Zobacz
sekcję Using open() for IPC w podręczniku
perlipc(1)). (Możesz nie mieć czystego open(),
powodującego, że komenda jest zarówno potokiem
wejściowym, jak i wyjściowym. Są jednak na to rady, zobacz
stronę podręcznika IPC::Open2, IPC::Open3, oraz
sekcję Bidirectional Communication w podręczniku
perlipc(1).)
Otwieranie '-' otwiera strumień STDIN, a otwieranie '>-' otwiera
STDOUT. Open po sukcesie zwraca zero, a w przeciwnym wypadku
wartość niezdefiniowaną. Jeśli open otworzył
potok, wartość zwracana jest identyfikatorem podprocesu (pid).
Jeśli masz na tyle pecha, że pracujesz z perlem na systemie,
który odróżnia pliki tekstowe i binarne (nowoczesne systemy
ich nie rozróżniają), to powinieneś poczytać o
funkcji binmode, opisanej gdzieś w tym dokumencie. Systemy,
wymagające binmode rozpoznaje się po ich formacie pliku
tekstowego. Systemy takie, jak Unix i Plan9, które oddzielają
linie pojedynczym znakiem i które kodują go w C jako
"\n", nie potrzebują binmode. Reszta tak.
Przykłady:
$ARTICLE = 100;
open ARTICLE or die "Nie mogę znaleźć artykułu $ARTICLE: $!\n";
while (<ARTICLE>) {...
open(LOG, '>>/usr/spool/news/twitlog'); # (log jest zarezerwowany)
open(DBASE, '+<dbase.mine'); # otwórz dla odnowienia
open(ARTICLE, "caesar <$article ⎪"); # dekoduj artykuł
open(EXTRACT, "⎪sort >/tmp/Tmp$$"); # $$ jest pidem naszego procesu
# przetwórz listę argumentów plików, wraz z wszelkimi załącznikami
foreach $file (@ARGV) {
process($file, 'fh00');
}
sub process {
local($filename, $input) = @_;
$input++; # jest to inkrementacja łańcuchowa
unless (open($input, $filename)) {
print STDERR "Nie mogę otworzyć $filename: $!\n";
return;
}
while (<$input>) { # note use of indirection
if (/^#include "(.*)"/) {
process($1, $input);
next;
}
... # cokolwiek
}
}
Możesz również, zgodnie z tradycją powłoki Bourne,
podać WYRAŻ, zaczynający się od ">&",
co oznacza, że reszta łańcucha jest interpretowana jako
nazwa uchwytu pliku (lub numerycznego deskryptora pliku), który
należy zduplikować i otworzyć. & można
użyć po >, >>, <, +>, +>>, i +<. Tryb,
który podasz, powinien odpowiadać trybowi oryginalnego uchwytu
pliku. (Duplikowanie uchwytów pliku nie pobiera na konto żadnych
istniejących zawartości buforów stdio.) Oto skrypt,
który zachowuje, przekierowuje i odświeża STDOUT i STDERR:
#!/usr/bin/perl
open(SAVEOUT, ">&STDOUT");
open(SAVEERR, ">&STDERR");
open(STDOUT, ">foo.out") ⎪⎪ die "Nie mogę przekierować stdout";
open(STDERR, ">&STDOUT") ⎪⎪ die "Nie mogę zduplikować stdout";
select(STDERR); $⎪ = 1; # zrób niebuforowane
select(STDOUT); $⎪ = 1; # j/w
print STDOUT "stdout 1\n"; # działa to też dla
print STDERR "stderr 1\n"; # podprocesów
close(STDOUT);
close(STDERR);
open(STDOUT, ">&SAVEOUT");
open(STDERR, ">&SAVEERR");
print STDOUT "stdout 2\n";
print STDERR "stderr 2\n";
Możesz podać "<&=N", gdzie N jest liczbą.
Perl wtedy dokona operacji równoważnej fdopen(3) z C. Na
przykład:
open(FILEHANDLE, "<&=$fd")
Jeśli otwierasz potok do komendy "-", np. albo
"⎪-" albo "-⎪", to dokonywany jest
niejawny fork, a zwrócona wartość open jest wewnątrz
procesu rodzicielskiego pidem potomka, a w wątku potomka zerem. (Aby
określić, czy open był pomyślny, użyj
defined($pid).) Uchwyt pliku u rodzica zachowuje się normalnie, lecz
i/o dla tego uchwytu jest przesyłane przez potok STDOUT/STDIN procesu
potomnego. W procesie potomny uchwyt nie jest otwierany--i/o jest z/do
nowego STDOUT lub STDIN. Zazwyczaj jest to używane jak normalny
potokowy open, lecz daje lepszą kontrolę nad wywoływaniem
komendy potoku, np. gdy pracujesz w suid i nie chcesz być zmuszonym
do skanowania komend powłoki w poszukiwaniu metaznaków.
Następujące pary są mniej lub bardziej
równoważne:
open(FOO, "⎪tr '[a-z]' '[A-Z]'");
open(FOO, "⎪-") ⎪⎪ exec 'tr', '[a-z]', '[A-Z]';
open(FOO, "cat -n '$file'⎪");
open(FOO, "-⎪") ⎪⎪ exec 'cat', '-n', $file;
Dla szczegółów, zobacz sekcję Safe Pipe Opens w
podręczniku perlipc(1).
UWAGA: Przy każdej operacji, dokonującej forkowania,
nieopróżnione bufory pozostają takie w obydwu procesach, co
znaczy, że lepiej ustawić $⎪, aby zapobiec duplikowaniu
wyjścia.
Zamykanie potokowego uchwytu pliku powoduje, że proces rodzicielski
czeka, aż dziecko zakończy i zwraca wartość statusu w
$?.
Jeśli używasz konstruktora z pakietu IO::Handle (lub z jego
podklas, takich jak IO::File czy IO::Socket), możesz generować
anonimowe uchwyty plików, które mają zakres dowolnych
zmiennych, które utrzymują do nich referencje. Zamykają
się one automatycznie po wyjściu z zakresu:
use IO::File;
...
sub read_myfile_munged {
my $ALL = shift;
my $handle = new IO::File;
open($handle, "myfile") or die "myfile: $!";
$first = <$handle>
or return (); # Automatyczne zamknięcie tutaj.
mung $first or die "mung failed"; # Lub tutaj.
return $first, <$handle> if $ALL; # Lub tutaj.
$first; # Lub tutaj.
}
Nazwa pliku, która jest przekazana open, przechodzi operację
usuwania prowadzących i kończących białych spacji. Aby
otworzyć plik, posiadający te dziwne znaki, trzeba je
chronić:
$file =~ s#^(\s)#./$1#;
open(FOO, "< $file\0");
Jeśli chcesz użyć prawdziwego, znanego z C open()
(zobacz stronę open(2)), to powinieneś użyć
funkcji sysopen(). Jest to inny sposób chronienia nazw
plików przed interpretacją. Np:
use IO::Handle;
sysopen(HANDLE, $path, O_RDWR⎪O_CREAT⎪O_EXCL, 0700)
or die "sysopen $path: $!";
HANDLE->autoflush(1);
HANDLE->print("stuff $$\n");
seek(HANDLE, 0, 0);
print "Plik zawiera: ", <HANDLE>;
Dla dalszych detali o miksowaniu odczytywania i zapisywania, obejrzyj opis
seek(), znajdujący się gdzie indziej w tym dokumencie.
- opendir UCHWYTKATALOGU,WYRAŻ
- Otwiera katalog o nazwie WYRAŻ. Otwarty uchwyt
można przetwarzać funkcjami readdir(), telldir(),
seekdir(), rewinddir(), i closedir(). Po sukcesie
zwraca TRUE. Uchwyty katalogów mają swoją własną
przestrzeń nazw. Jest ona oddzielna od uchwytów plików.
- ord WYRAŻ
-
- ord
- Zwraca numeryczną wartość ascii pierwszego
znaku WYRAŻ. Jeśli WYRAŻ zostało pominięte,
używane jest $_. Dla operacji odwrotnej, zobacz opis chr,
znajdujący się gdzieś w tym dokumencie.
- pack WZORZEC,LISTA
- Pobiera tablicę lub listę wartości i pakuje
ją w strukturę binarną, zwracając łańcuch,
zawierający tę strukturę. WZORZEC jest sekwencją
znaków, które pokazują kolejność i typy
wartości. Są one następujące:
A Łańcuch ascii, dopełniany spacjami.
a Łańcuch ascii, dopełniany przez null.
b Łańcuch bitowy (wznosząca kolejność bitów, jak w vec()).
B Łańcuch bitowy (malejąca kolejność bitów).
h Łańcuch szesnastkowy (najpierw niski nibble).
H Łańcuch szesnastkowy (najpierw wysoki nibble).
c Wartość char ze znakiem.
C Wartość char bez znaku.
s Wartość short.
S Wartość short bez znaku.
(Ten 'short' jest _dokładnie_ 16 bitowy, co może się różnić od
tego, co lokalny kompilator C nazywa jako 'short'.)
i Wartość int ze znakiem.
I Wartość int bez znaku.
(Ten 'int' jest przynajmniej 32 bitowy. Dokładny rozmiar zależy
od tego, co lokalny kompilator C uważa za 'int' i może być nawet
większe niż 'long', opisywany dalej.)
l Wartość long ze znakiem.
L Wartość long bez znaku.
(Ta wartość 'long' jest _dokładnie_ 32 bitowa, co może się
różnić od tego, co lokalny kompilator C uważa za 'long'.)
n Short w porządku sieciowym (big-endian).
N Long w porządku sieciowym (big-endian).
v Short w porządku "VAX" (little-endian).
V Long w porządku "VAX" (little-endian).
(Te 'short' i 'long' są _dokładnie_ 16 i
32 bitowe (odpowiednio).)
f Float pojedynczej precyzji w formacie macierzystym.
d Float podwójnej precyzji w formacie macierzystym.
p Wskaźnik do łańcucha zakończonego zerem.
P Wskaźnik do struktury (łańcuch o ustalonej długości).
u Uuencodowany łańcuch.
w Skompresowany integer BER. Jego bajty reprezentują całkowity
integer o podstawie 128, najpierw bardziej znaczące cyfry,
z tak małą ilością cyfr, jak tylko się da. Ósmy bit jest ustawiany
na każdym bajcie, poza ostatnim.
x Bajt null.
X Wstecz o bajt (?) (Back up a byte).
@ Wypełnienie null do bezwzględnej pozycji (?)
(Null fill to absolute position).
Po każdej literze może opcjonalnie następować liczba,
która podaje licznik powtórzeń. Dla wszystkich typów,
poza "a", "A", "b", "B",
"h", "H", i "P", funkcja pack pożre
tyle samo wartości z LISTY. Gwiazdka (*) dla licznika
powtórzeń, oznacza użycie wszystkich elementów,
które pozostały. Typy "a" i "A"
pobierają tylko jedną wartość, lecz pakują
ją jako łańcuch o podanej długości,
wypełniając ją w razie potrzeby zerami, lub spacjami.
(Podczas rozpakowywania, "A" zdejmuje kończące spacje
i zera, lecz "a" tego nie robi.) Podobnie, pola "b" i
"B" pakują łańcuchy, które są
długości tylu bitów. "h" i "H"
pakują łańcuchy, które są długości tylu
nibblów. "P" pakuje wskaźnik do struktury, której
rozmiar jest wskazywany przez długość. Liczby rzeczywiste
(float, double) są tylko w formacie macierzystym maszyny; z powodu
wielości formatów zmiennoprzecinkowych i braku standardowej
reprezentacji "sieciowej", nie ma żadnego sposobu
uniwersalnej wymiany. Oznacza to, że spakowane dane
zmiennoprzecinkowe, zapisane na jednej maszynie, mogą nie być
odczytywalne na innej - nawet jeśli obydwie używają
arytmetyki zmiennoprzecinkowej IEEE (gdyż endainowość
pamięci nie jest częścią specyfikacji IEEE).
Zauważ, że perl używa wewnętrznie dla wszystkich
obliczeń numerycznych reprezentacji double i że konwersja z
double na float, a potem z powrotem na double powoduje utratę
precyzji (np. unpack("f", pack("f", $foo)) nie
będzie w ogólnym przypadku się równać $foo).
Przykłady:
$foo = pack("cccc",65,66,67,68);
# foo to "ABCD"
$foo = pack("c4",65,66,67,68);
# to samo
$foo = pack("ccxxcc",65,66,67,68);
# foo to "AB\0\0CD"
$foo = pack("s2",1,2);
# "\1\0\2\0" na little-endian
# "\0\1\0\2" na big-endian
$foo = pack("a4","abcd","x","y","z");
# "abcd"
$foo = pack("aaaa","abcd","x","y","z");
# "axyz"
$foo = pack("a14","abcdefg");
# "abcdefg\0\0\0\0\0\0\0"
$foo = pack("i9pl", gmtime);
# rzeczywista struktura tm (przynajmniej na moim systemie)
sub bintodec {
unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
Ten sam wzorzec może być ogólnie używany też w
funkcji unpack.
- package PRZESTRZEŃNAZW
- Deklaruje jednostkę kompilacji,
przynależącą do danej przestrzeni nazw. Zakres deklaracji
pakietu leży od deklaracji, do końca otaczającego bloku
(tak samo, jak zakres operatora local()). Wszelkie dalsze
niekwalifikowane identyfikatory dynamiczne będą wewnątrz
tej przestrzeni nazw. Instrukcja package dotyczy tylko zmiennych
dynamicznych--włączając w to te, których
użyłeś lokalnie ( local()),--lecz nie zmienne
leksykalne, utworzone przez my(). Zazwyczaj jest to pierwsza
deklaracja we włączanym przez require lub use pliku.
Możesz przełączyć się do pakietu w więcej
niż jednym miejscu; ma to wpływ jedynie na to, której
tablicy symboli używa kompilator dla reszty bloku. Do zmiennych i
uchwytów plików z innych pakietów, możesz odnosić
się, poprzedzając identyfikatory nazwami pakietów, za
którymi następują dwa dwukropki: $Pakiet::Zmienna.
Jeśli nazwa pakietu jest zerowa, używany jest pakiet main. Tak
więc $::sail jest równoważne $main::sail.
Zobacz sekcję Packages w podręczniku perlmod(1).
Zobacz też podręcznik perlsub(1), gdzie opisane są
problemy zakresów.
- pipe UCHWYTODCZYTU,UCHWYTZAPISU
- Otwiera parę połączonych potoków,
zupełnie jak wywołanie systemowe pipe(2). Zauważ,
że jeśli zestawiasz pętle potokowych procesów, to o
ile nie zachowasz ostrożności, może pojawić się
deadlock. Dodatkowo, zauważ, że potoki perla używają
buforowania stdio, więc możesz być zmuszonym ustawić
$⎪, aby opróżnić swój UCHWYTZAPISU po
każdej z komend, zależnie od aplikacji.
Obejrzyj jeszcze stronę IPC::Open2, IPC::Open3 oraz
sekcję Bidirectional Communication z podręcznika
perlipc(1). Są tam przykłady takich rzeczy.
- pop TABLICA
-
- pop
- Pobiera i zwraca ostatnią wartość tablicy,
skracając ją o jeden. Ma podobne działanie do
$tmp = $ARRAY[$#ARRAY--];
Jeśli tablica nie ma elementów, zwracana jest wartość
niezdefiniowana. Jeśli parametr TABLICA zostanie pominięty, to
pobiera z tablicy @ARGV w programie głównym, oraz z @_ w
podprocedurach, podobnie jak shift().
- pos SKALAR
-
- pos
- Zwraca offset, gdzie dla zmiennej SKALAR
zakończyło się ostatnie przeszukiwanie m//g. (Jeśli
nie podano zmiennej, używany jest $_). Można go modyfikować
w celu zmieniania offsetu. Modyfikacja ta wpłynie również
na zapewnienia zerowej szerokości \G w wyrażeniach regularnych.
Zobacz podręczniki perlref(1) i perlop(1).
- print UCHWYTPLIKU LISTA
-
- print LISTA
-
- print
- Drukuje oddzieloną przecinkami listę
łańcuchów. Po sukcesie zwraca TRUE. UCHWYTPLIKU może
być nazwą zmiennej skalarnej, w którym wypadku zmienna ta
przechowuje nazwę lub referencję do uchwytu pliku,
wprowadzając tak poziom niebezpośredniości. (UWAGA:
Jeśli UCHYTPLIKU jest zmienną, a następny token jest
[term], to może to być źle zinterpretowane jako operator,
chyba że wstawisz +, lub ujmiesz argumenty w nawiasy.) Jeśli
UCHWYTPLIKU jest pominięty, drukowanie następuje na standardowe
wyjście (lub do ostatnio wybranego kanału
wyjściowego--zobacz opis select, znajdujący się gdzieś
w tym dokumencie ). Jeśli pominięto również argument
LISTY, na STDOUT drukowane jest $_. Aby ustawić kanał
wyjściowy na coś innego niż STDOUT, użyj operacji
select. Zauważ, że z uwagi na to, że print pobiera
LISTĘ, wszystko z LISTY jest analizowane w kontekście listowym,
a wszelka podprocedura, którą wywołasz, będzie
miała jedno, lub więcej wyrażeń analizowanych w
kontekście listowym. Uważaj też, by nie wpisywać z
słowem kluczowym print lewego nawiasu, chyba że chcesz by
odpowiadający prawy nawias kończył argumenty do
drukowania--wstaw +, lub otocz wszystkie argumenty nawiasami.
Zauważ, że jeśli przechowujesz UCHWYTYPLIKÓW w tablicy,
lub innym wyrażeniu, będziesz musiał używać
bloku, zwracającego jego wartość:
print { $files[$i] } "stuff\n";
print { $OK ? STDOUT : STDERR } "stuff\n";
- printf UCHWYTPLIKU FORMAT, LISTA
-
- printf FORMAT, LISTA
- Równoważne print UCHWYTPLIKU sprintf(FORMAT,
LISTA). Pierwszy argument list będzie interpretowany jako format
printf. Jeśli włączone jest use locale, to znak
używany dla kropki dziesiętnej jest zależny od locala
LC_NUMERIC. Zobacz stronę podręcznika perllocale(1).
Nie wpadnij w pułapkę używania printf(), gdy
wystarczyłby zwykły print(). Funkcja print() jest
efektywniejsza i mniej wrażliwa na błędy.
- prototype FUNKCJA
- Zwraca w postaci łańcucha prototyp funkcji (lub
undef, jeśli funkcja nie ma prototypu). FUNKCJA jest referencją
lub nazwą funkcji, której prototyp usiłujemy uzyskać.
- push TABLICA,LISTA
- Traktuje TABLICĘ jako stos i wrzuca na jej szczyt
wartości LISTY. Długość TABLICY zwiększa się
o długość LISTY. Ma takie samo działanie jak
for $value (LIST) {
$ARRAY[++$#ARRAY] = $value;
}
lecz jest efektywniejsze. Zwraca nową liczbę elementów
tablicy.
- q/ŁAŃCUCH/
-
- qq/ŁAŃCUCH/
-
- qx/ŁAŃCUCH/
-
- qw/ŁAŃCUCH/
- Uogólnione cudzysłowy. Zobacz stronę
perlop(1).
- quotemeta WYRAŻ
-
- quotemeta
- Zwraca wartość WYRAŻ z poprzedzonymi
odwróconymi ukośnikami wszystkimi nie-alfanumerycznymi znakami.
(To znaczy, że wszystkie znaki, nie podpadające pod
/[A-Za-z_0-9]/ zostaną poprzedzone odwrotnym ukośnikiem,
niezależnie od ustawień locale.) Jest to wewnętrzna
funkcja, implementująca escape Q w łańcuchach z
podwójnych cudzysłowów.
Jeśli WYRAŻ jest pominięte, używane jest $_.
- rand WYRAŻ
-
- rand
- Zwraca losową liczbę, większą lub
równą 0 i mniejszą od wartości WYRAŻ. (WYRAŻ
powinno być dodatnie.) Jeśli WYRAŻ jest pominięte,
używana jest wartość 1. Automatycznie wywołuje
srand(), chyba że był on już wywołany. Zobacz
też opis srand().
(Uwaga: Jeśli twoja funkcja rand zwraca stale liczby, które
są zbyt wielkie, lub zbyt małe, to znaczy, że twoja wersja
perla prawdopodobnie została skompilowana ze złą
liczbą RANDBITS.)
- read UCHWYTPLIKU,SKALAR,DŁUGOŚĆ,OFFSET
-
- read UCHWYTPLIKU,SKALAR,DŁUGOŚĆ
- Próbuje odczytać DŁUGOŚĆ
bajtów danych do zmiennej SKALAR z pliku wskazywanego przez
UCHWYTPLIKU. Zwraca liczbę odczytanych bajtów, lub undef w
wypadku błędu. SKALAR zostanie rozciągnięty, lub
skurczony do rzeczywistej długości odczytanych danych.
Można też podać OFFSET. Wtedy odczyt nastąpi w innym
miejscu niż początek łańcucha. Wywołanie to jest
w rzeczywistości zaimplementowane w oparciu o wywołanie fread(3)
stdio. Aby uzyskać prawdziwe wywołanie systemowe read(2),
użyj sysread().
- readdir UCHWYTKATALOGU
- Zwraca następny wpis katalogu, otwartego przez
opendir(). Jeśli jest używane w kontekście listowym,
zwraca resztę wpisów w katalogu. Jeśli nie ma już
więcej wpisów, w kontekście skalarnym zwracana jest
wartość niezdefiniowana, a w kontekście listowym listę
null.
Jeśli masz zamiar dokonywać testów plikowych na
wartościach zwracanych przez readdir(), to lepiej
poprzedź te nazwy katalogiem. Powinno się tak robić,
gdyż nie readdir() nie przechodzi do swojego katalogu i
zaszło by testowanie nie tego pliku co trzeba.
opendir(DIR, $some_dir) ⎪⎪ die "Nie powiódł się opendir $some_dir: $!";
@dots = grep { /^\./ && -f "$some_dir/$_" } readdir(DIR);
closedir DIR;
- readlink WYRAŻ
-
- readlink
- Zwraca wartość dowiązania symbolicznego.
Działa to, jeśli dowiązania symboliczne są
zaimplementowane [w systemie]. W przeciwnym wypadku powstaje
błąd krytycznych. W wypadku błędu systemowego,
zwracana jest wartość niezdefiniowana i ustawiane jest $!
(errno). Jeśli WYRAŻ zostanie pominięte, używane jest
$_.
- recv GNIAZDO,SKALAR,DŁUGOŚĆ,FLAGI
- Odbiera komunikat na gnieździe. Próbuje
odebrać DŁUGOŚĆ bajtów do zmiennej SKALAR.
(GNIAZDO to uchwyt gniazda). W rzeczywistości funkcja wykonuje
odpowiednik funkcji C recvfrom()(2), więc zwraca adres
nadawcy. W wypadku błędu, zwracana jest wartość
niezdefiniowana. SKALAR będzie rozciągany do długości
rzeczywiście odczytanych danych. Flagi są takie same jak w
wywołaniu systemowym o tej samej nazwie. Zobacz jeszcze sekcję
UDP: Message Passing w podręczniku perlipc(1). Są
tam przykłady.
- redo ETYKIETA
-
- redo
- Komenda redo restartuje blok pętli, nie
analizując przy tym warunku. Blok continue (jeśli taki istnieje)
również nie jest wykonywany. Jeśli pominięta zostanie
ETYKIETA, komenda odnosi się do najbardziej wewnętrznej
otaczającej pętli. Komenda ta jest zazwyczaj wykorzystywana
przez programy, które chcą się oszukiwać co do tego,
co było właśnie pobrane:
# Uproszczony ogołacacz komentarzy Pascala
# (uwaga: zakłada brak { i } w łańcuchach)
LINE: while (<STDIN>) {
while (s⎪({.*}.*){.*}⎪$1 ⎪) {}
s⎪{.*}⎪ ⎪;
if (s⎪{.*⎪ ⎪) {
$front = $_;
while (<STDIN>) {
if (/}/) { # Koniec komentarza?
s⎪^⎪$front{⎪;
redo LINE;
}
}
}
print;
}
- ref WYRAŻ
-
- ref
- Jeśli wartość WYRAŻ jest
referencją, zwracane jest TRUE, a w przeciwnym wypadku FALSE.
Jeśli WYRAŻ zostanie pominięte, użyte zostanie $_.
Zwracana wartość zależy od typu, do którego referencja
jest referencją. Wbudowane typy to:
REF
SCALAR
ARRAY
HASH
CODE
GLOB
Jeśli referencjowany obiekt został błogosławiony (
bless()) do pakietu, to zwracana jest nazwa pakietu. Możesz
myśleć o ref() jak o operatorze typeof().
if (ref($r) eq "HASH") {
print "r jest referencją do tablicy asocjacyjnej.\n";
}
if (!ref ($r) {
print "r nie jest referencją.\n";
}
Zobacz też stronę podręcznika perlref(1).
- rename STARANAZWA,NOWANAZWA
- Zmienia nazwę pliku. Po sukcesie zwraca 1, w
przeciwnym wypadku 0. Nie działa między granicami systemów
plików.
- require WYRAŻ
-
- require
- Zażądaj pewnej właściwości,
podanej przez WYRAŻ, lub $_, jeśli go nie podano. Jeśli
WYRAŻ jest numeryczne, to wymaga ono by bieżąca wersja
perla ($] lub $PERL_VERSION) była większa lub równa
WYRAŻ.
W przeciwnym wypadku żąda włączenia pliku biblioteki (o
ile nie jest on już włączony). Plik jest włączany
z użyciem mechanizmu do-PLIK, który w zasadzie jest
wariacją eval(). Semantyka jest podobna do
następującej podprocedury:
sub require {
local($filename) = @_;
return 1 if $INC{$filename};
local($realfilename,$result);
ITER: {
foreach $prefix (@INC) {
$realfilename = "$prefix/$filename";
if (-f $realfilename) {
$result = do $realfilename;
last ITER;
}
}
die "Nie mogę znaleźć $filename w \@INC";
}
die $@ if $@;
die "$filename nie zwróciło prawdziwej wartości" unless $result;
$INC{$filename} = $realfilename;
$result;
}
Zauważ, że plik nie będzie włączany pod tą
samą nazwą dwukrotnie. Jako ostatnią instrukcję, plik
musi zwracać TRUE, wskazując tak pomyślne wykonanie kodu
inicjalizacji, więc zazwyczaj kończy się takie pliki
"1;", chyba że jesteś pewien, że zwróci TRUE
tak czy inaczej. Lepiej jednak wstawić po prostu"1;", na
wypadek np. dodania nowych instrukcji.
Jeśli WYRAŻ jest prostym słowem, require zakłada
rozszerzenie " .pm" i samodzielnie zamienia "
::" na " /", ułatwiając
ładowanie modułów standardowych. Ta postać
ładowania modułów nie ryzykuje zmieniania twojej
przestrzeni nazw. to make it easy to load standard modules. This form of
loading of modules does not risk altering your namespace.
Dla potężniejszego narzędzia importu, obejrzyj opis use,
znajdujący się w tym dokumencie, oraz stronę
perlmod(1).
- reset WYRAŻ
-
- reset
- Ogólnie, używane w bloku continue na końcu
pętli, w celu wyczyszczenia zmiennych i resetowania przeszukiwań
??, tak by znów działały. Wyrażenie jest
interpretowane jako lista pojedynczych znaków (dla podawania
zakresów, można używać myślników). Wszystkie
zmienne i tablice, rozpoczynające się na jedną z tych
liter, są resetowane do stanu pierwotnego. Jeśli wyrażenie
zostanie pominięte, przeszukiwania jednego-trafienia (?wzorzec?)
są resetowane do ponownego trafienia. Resetowanie tyczy się
tylko obiektów bieżącego pakietu. Zwracane jest zawsze 1.
Przykłady:
reset 'X'; # resetuj wszystkie zmienne X
reset 'a-z'; # resetuj zmienne małoliterowe
reset; # resetuj tylko przeszukiwania ??
Resetowanie "A-Z" nie jest zalecane, gdyż odniesie się
ono również do tablic ARGV i ENV. Resetowane są tylko
zmienne pakietu--zmienne leksykalne są nietykane, lecz one i tak
oczyszczają się na wyjściu z zakresu. Zobacz opis my,
znajdujący się gdzieś w tym dokumencie.
- return WYRAŻ
-
- return
- Powraca z podprocedury, eval(), lub z do PLIK, z
wartością podaną przez WYRAŻ. Analiza WYRAŻ
może zachodzić w kontekście listowym, skalarnym, lub pustym
(void). Zależy to od sposobu użycia wartości zwracanej, a
kontekst może się zmieniać od jednego wywołania do
drugiego (zobacz wantarray()). Jeśli WYRAŻ nie jest
podane, w kontekście skalarnym zwracana jest wartość
niezdefiniowana, w listowym pusta lista, a w pustym (void) nic.
(Zauważ, że przy braku return, podprocedura, eval, lub do PLIK
zakończą automatycznie z wartością ostatniego
wykonanego wyrażenia.)
- reverse LISTA
- W kontekście listowym, zwraca wartość
listową, składającą się z elementów LISTY,
ułożonych w przeciwnym porządku. W kontekście
skalarnym, elementy listy są łączone w łańcuch i
zwracane w odwróconym porządku.
print reverse <>; # line tac, last line first
undef $/; # for efficiency of <>
print scalar reverse <>; # byte tac, last line tsrif
Operator ten jest też przydatny do inwersji tablicy asocjacyjnej,
choć są tu pewne zastrzeżenia. Jeśli wartość
jest w oryginalnej tablicy zduplikowana, to tylko jedna z nich może
być reprezentowana jako klucz w tablicy odwróconej. Musi to
też przewinąć całą tablicę i zbudować
nową, co dla dużej tablicy może trochę potrwać.
%by_name = reverse %by_address; # Inwersja tablicy asocjacyjnej
- rewinddir UCHWYTKATALOGU
- Ustawia bieżącą pozycję (dla funkcji
readdir()) na początek katalogu, wskazywanego przez
UCHWYTKATALOGU.
- rindex STR,SUBSTR,POZYCJA
-
- rindex STR,SUBSTR
- Działa tak samo jak index, lecz zwraca pozycję
ostatniego pojawienia się SUBSTR w STR. Jeśli podano
POZYCJĘ, to zwracane jest ostatnie pojawienie na, lub przed tą
pozycją.
- rmdir NAZWAPLIKU
-
- rmdir
- Kasuje pusty katalog podany przez NAZWĘPLIKU.
Jeśli operacja się powiedzie, zwraca 1. W przeciwnym wypadku
zwracane jest zero i ustawiane jest $! (errno). Jeśli NAZWAPLIKU jest
pominięta, używane jest $_.
- s///
- Operator podmienienia. Zobacz stronę perlop(1).
- scalar WYRAŻ
- Wymusza interpretację skalarną wyrażenia
WYRAŻ i zwraca jego wartość.
@counts = ( scalar @a, scalar @b, scalar @c );
Nie istnieje odpowiednik, konwertujący skalar w listę. Jest tak
dlatego, że w praktyce nie jest on nigdy potrzebny. Jeśli jednak
naprawdę chcesz tak zrobić, możesz użyć
konstrukcji @{[ (jakieś wyrażenie) ]}, a zwykle powinno
wystarczyć zwykłe (some expression).
- seek UCHWYTPLIKU,POZYCJA,GDZIE
- Ustawia pozycję UCHWYTUPLIKU, podobnie jak
fseek(3) w stdio. UCHYTPLIKU może być wyrażeniem,
którego wartość daje nazwę uchwytu pliku.
Wartości GDZIE to 0, oznaczające ustawianie nowej pozycji na
POZYCJĘ, 1 oznaczające ustawianie pozycji na pozycję
bieżącą plus POZYCJĘ, oraz 2 ustawiające
pozycję na EOF plus POZYCJĘ (zazwyczaj ujemną). Zamiast
numerycznych wartości GDZIE, można używać stałych
SEEK_SET, SEEK_CUR i SEEK_END z modułu IO::Seekable lub POSIX. Po
sukcesie zwracane jest 1, po błędzie 0.
Jeśli chcesz ustawić pozycję pliku dla sysread() i
syswrite(), nie używaj seek() -- użyj
sysseek().
Na niektórych systemach musisz wykonać seek za każdym razem,
gdy przełączasz się między zapisem i odczytem.
Wśród innych rzeczy, może to mieć efekt wołania
funkcji stdio clearerr(3). Wartość GDZIE 1 jest przydatna
do nie ruszania się z pozycji pliku:
seek(TEST,0,1);
Jest to również przydatne dla aplikacji, emulujących tail -f.
Gdy raz wejdziesz na EOF, a potem zaśniesz na chwilę, to dobrze
przed następnym odczytem użyć seek(), aby wszystko
zresetować. seek() nie zmienia bieżącej pozycji,
lecz czyści warunek EOF uchwytu, więc następne
<PLIK> powoduje, że perl znów coś będzie
próbował odczytać. Mamy przynajmniej taką
nadzieję.
Jeśli to nie działa (niektóre stdio są szczególnie
dziwne), to możesz potrzebować czegoś więcej, jak:
for (;;) {
for ($curpos = tell(FILE); $_ = <FILE>; $curpos = tell(FILE)) {
# szukaj jakichś rzeczy i wstaw je do plików
}
sleep($for_a_while);
seek(FILE, $curpos, 0);
}
- seekdir UCHWYTKATALOGU,POZYCJA
- Ustawia bieżącą pozycję polecenia
readdir() dla katalogu wskazywanego przez UCHWYTKATALOGU. POZYCJA
musi mieć wartość zwracaną przez telldir().
- select UCHWYTPLIKU
-
- select
- Zwraca obecnie wybrany uchwyt pliku. Jeśli podano
UCHWYTPLIKU, ustawia domyślny uchwyt pliku dla wyjścia. Daje to
dwa efekty: po pierwsze write, lub print bez uchwytu pliku będą
zapisywały domyślnie do tego UCHWYTUPLIKU. Po drugie,
odniesienia zmiennych, związanych z wyjściem, będą
się odnosiły do tego kanału wyjścia. Np. jeśli
masz ustawić początek formatu formy dla więcej niż
jednego kanału, mógłbyś użyć
następującego:
select(REPORT1);
$^ = 'report1_top';
select(REPORT2);
$^ = 'report2_top';
UCHWYTPLIKU może być wyrażeniem, które daje nazwę
rzeczywistego uchwytu pliku. Tak więc:
$oldfh = select(STDERR); $⎪ = 1; select($oldfh);
Niektórzy programiści wolą myśleć o uchwytach pliku
jak o obiektach, posiadających metody, zapisując ostatni
przykład jako:
use IO::Handle;
STDERR->autoflush(1);
- select RBITS,WBITS,EBITS,TIMEOUT
- Funkcja ta woła z podanymi maskami bitowymi
wywołanie systemowe select(2). Maski można
skonstruować, używając fileno() i vec():
$rin = $win = $ein = '';
vec($rin,fileno(STDIN),1) = 1;
vec($win,fileno(STDOUT),1) = 1;
$ein = $rin ⎪ $win;
Jeśli chcesz wykonywać tę funkcję na wielu uchwytach
plików, możesz napisać podprocedurę:
sub fhbits {
local(@fhlist) = split(' ',$_[0]);
local($bits);
for (@fhlist) {
vec($bits,fileno($_),1) = 1;
}
$bits;
}
$rin = fhbits('STDIN TTY SOCK');
Spotykanym idiomem jest:
($nfound,$timeleft) =
select($rout=$rin, $wout=$win, $eout=$ein, $timeout);
aby blokować, aż coś stanie się gotowe, wykonaj po
prostu
$nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef);
Większość systemów nie zwraca niczego mądrego w
$timeleft, więc wywołanie select() w kontekście
skalarnym zwróci po prostu $nfound.
Każda z masek bitowych może być niezdefiniowana. Podany
timeout jest podawany w sekundach. Może być ułamkowy.
Uwaga: nie wszystkie implementacje zwracają $timeleft. Jeśli go
nie zwracają, to zwracają wartość równą tej,
przekazanej w $timeout.
A oto 250 milisekundowe zaśnięcie:
select(undef, undef, undef, 0.25);
UWAGA: Nie próbuj łączyć buforowanego I/O (np.
read czy <FH>) z funkcją select. Użyj
zamiast tego sysread().
- semctl ID,SEMNUM,CMD,ARG
- Woła funkcję IPC semctl(2) z Systemu V.
Jeśli CMD to &IPC_STAT lub &GETALL, to ARG musi być
zmienną, która będzie przechowywać zwróconą
strukturę semid_ds, lub tablicę wartości semafora. Podczas
błędu, podobnie jak ioctl zwraca wartość
niezdefiniowaną, dla zera łańcuch "0 but true", a
dla pozostałych wartości rzeczywistą wartość
zwróconą.
- semget KLUCZ,NSEMS,FLAGI
- Woła funkcję IPC semget(2) z Systemu V.
Zwraca identyfikator semafora, lub wartość niezdefiniowaną
w przypadku błędu.
- semop KLUCZ,ŁAŃCUCHOP
- Woła funkcję IPC semop(2) z Systemu V.
Funkcja ta dokonuje operacji semaforowych, np. sygnalizowania i czekania.
ŁAŃCUCHOP musi być spakowaną tablicą struktur
semop. Każdą ze struktur semop można wygenerować z
pomocą pack("sss", $semnum, $semop, $semflag). Liczba
operacji semaforowych jest implikowana długością
ŁAŃCUCHOP. Po sukcesie, funkcja zwraca TRUE, a w wypadku
błędu FALSE. Na przykład następujący fragment
kodu oczekuje na semaforze $semnum z identyfikatora $semid:
$semop = pack("sss", $semnum, -1, 0);
die "Problem z semaforem: $!\n" unless semop($semid, $semop);
Aby ustawić semafor, zamień "-1" na "1".
- send GNIAZDO,MSG,FLAGI,DO
-
- send GNIAZDO,MSG,FLAGI
- Wysyła na gniazdo komunikat. Pobiera takie same flagi,
jak wywołanie systemowe send(2). Na gniazdach
niepodłączonych, należy podać cel wysyłania,
czyli argument DO. W tej sytuacji użyta zostanie funkcja C
sendto(2). Funkcja zwraca liczbę wysłanych znaków,
lub w wypadku błędu wartość niezdefiniowaną.
Zobacz jeszcze sekcję UDP: Message Passing w podręczniku
perlipc(1). Są tam przykłady.
- setpgrp PID,PGRP
- Ustawia bieżącą grupę procesów dla
podanego PIDa (wynoszącego 0 dla procesu bieżącego).
Funkcja powoduje błąd krytyczny na maszynach nie
implementujących setpgrp(2). Jeśli argumenty są
pominięte, odnosi się to domyślnie do 0,0. Zauważ,
że wersja POSIX setpgrp() nie przyjmuje żadnych
argumentów, więc przenośne jest tylko setpgrp 0,0.
- setpriority CZYJE,KTO,PRIORYTET
- Ustawia bieżący priorytet procesu, grupy
procesów, lub użytkownika. (Zobacz setpriority(2).) Na
maszynach nie implementujących tego wywołania systemowego,
powoduje błąd krytyczny.
- setsockopt GNIAZDO,POZIOM,NAZWAOPC,WARTOPC
- Ustawia żądaną opcję gniazda. W wypadku
błędu, zwraca wartość niezdefiniowaną. Jeśli
nie chcesz przekazywać argumentu, WARTOPC może być podane
jako undef.
- shift TABLICA
-
- shift
- Wysuwa pierwszą wartość tablicy i zwraca
ją, skracając tablicę o 1 i przenosząc wszystko w
dół. Jeśli w tablicy nie ma elementów, zwracana jest
wartość niezdefiniowana. Jeśli TABLICA zostanie
pominięta, to przesuwana jest w programie głównym tablica
@ARGV, oraz @_ w podprocedurach. (Jest to określone leksykalnie.)
Zobacz też unshift(), push() oraz pop().
Shift() i unshift() robią to samo na lewym końcu
tablicy, co pop() i push() na prawym.
- shmctl ID,CMD,ARG
- Woła funkcję IPC shmctl(2) z Systemu V.
Jeśli CMD jest &IPC_STAT, to ARG musi być zmienną,
która będzie przechowywać zwróconą strukturę
shmid_ds. Wartość zwracana jest jak w ioctl: wartość
niezdefiniowana dla błędu, "0 but true" dla zera i
rzeczywista wartość zwrócona w innych wypadkach.
- shmget KLUCZ,ROZMIAR,FLAGI
- Woła funkcję IPC shmget(2) z Systemu V.
Zwraca identyfikator pamięci dzielonej, a w przypadku błędu
wartość niezdefiniowaną.
- shmread ID,ZMIENNA,POZYCJA,ROZMIAR
-
- shmwrite ID,ŁAŃCUCH,POZYCJA,ROZMIAR
- Odczytuje, lub zapisuje segment pamięci dzielonej,
rozpoczynając w pozycji POZYCJA i obsługując rozmiar
ROZMIAR bajtów. Podczas odczytu, ZMIENNA musi być elementem,
który będzie przechowywał odczytane dane. Podczas
zapisywania, jeśli ŁAŃCUCH jest zbyt długi,
użytych zostanie tylko ROZMIAR bajtów; jeśli
ŁAŃCUCH jest zbyt krótki, to reszta zostanie
wypełniona nullami. Funkcja zwraca po sukcesie TRUE oraz FALSE w
wypadku błędu.
- shutdown GNIAZDO,JAK
- Wyłącza połączenie na gnieździe, w
sposób wskazany przez JAK, który ma taką samą
interpretację, jak w wywołaniu systemowym shutdown(2).
- sin WYRAŻ
-
- sin
- Zwraca sinus z WYRAŻ (podanego w radianach).
Jeśli WYRAŻ jest pominięte, zwracana jest wartość
dla $_.
Dla operacji odwrotnej do sinusa, możesz użyć funkcji
POSIX::asin(), lub następującej relacji:
sub asin { atan2($_[0], sqrt(1 - $_[0] * $_[0])) }
- sleep WYRAŻ
-
- sleep
- Powoduje, że skrypt zasypia na WYRAŻ sekund, lub
na zawsze, jeśli nie podano WYRAŻ. Spanie można
przerwać, przesyłając procesowi SIGALRM. Zwraca
ilość przespanych sekund. Przypuszczalnie nie powinno się
łączyć wywołań alarm() i sleep(),
gdyż sleep() jest często implementowane przy użyciu
alarm().
Na niektórych systemach, spanie może trwać do sekundy mniej
niż żądałeś, zależnie od sposobu obliczania
sekund. Większość nowoczesnych systemów przesypia
cały okres.
Dla pauz, lub większej dokładności niż sekunda,
możesz użyć interfejsu syscall() perla i dostać
się do funkcji setitimer(2), o ile jest ona obsługiwana
przez twój system. Możesz też zapoznać się z
opisem select(), znajdującym się gdzieś w tym dokumencie.
Zobacz także funkcję sigpause() z modułu POSIX.
- socket GNIAZDO,DOMENA,TYP,PROTOKÓŁ
- Otwiera gniazdo podanego typu i przywiązuje je do
uchwytu pliku GNIAZDO. DOMENA, TYP i PROTOKÓŁ są takie same
jak dla wywołania systemowego socket(2). Przed używaniem tej
funkcji, powinieneś użyć "use Socket;", aby
zaimportować odpowiednie definicje. Obejrzyj przykład w sekcji
Sockets: Client/Server Communication w podręczniku
perlipc(1).
- socketpair
GNIAZDO1,GNIAZDO2,DOMENA,TYP,PROTOKÓŁ
- Tworzy nienazwaną parę gniazd danego typu, w
podanej domenie. DOMENA, TYP i PROTOKÓŁ są podawane tak
samo, jak dla wywołania systemowego socketpair(2). Jeśli funkcja
nie jest zaimplementowana, to powoduje błąd krytyczny. Po
sukcesie zwracane jest TRUE.
- sort NAZWA LISTA
-
- sort BLOK LISTa
-
- sort LISTA
- Sortuje LISTĘ i zwraca posortowaną
wartość listową. Jeśli pominięte zostaną
parametry NAZWA lub BLOK, sortowanie następuje w porządku
porównywania łańcuchów. Jeśli podano NAZWĘ,
to wskazuje ona na podprocedurę, zwracającą liczbę
całkowitą, która jest mniejsza, równa, lub
większa od zera, zależnie od tego, jak elementy tablicy
mają być poukładane. W takich procedurach bardzo przydatne
są operatory <=> oraz cmp. NAZWA może być nazwą
zmiennej skalarnej--w tym wypadku wartość daje nazwę
używanej podprocedury. Zamiast NAZWY można podać BLOK,
czyli anonimową podprocedurę sortującą.
W celu polepszenia efektywności, pomijany jest normalny kod
wołania podprocedur: podprocedura nie może być
rekurencyjna, a dwa porównywane elementy nie są przekazywane
przez @_, lecz jako globalne zmienna pakietu $a oraz $b (zobacz
przykład poniżej). Są one przekazywane przez
referencję, więc nie modyfikuj ani $a, ani $b. Nie próbuj
też deklarować ich jako leksykalne.
Nie można też wyjść z bloku sortującego przy
użyciu żadnego operatora kontroli pętli czy goto().
Gdy działa use locale, sort LIST sortuje LISTĘ według
odpowiedniego locale. Zobacz stronę perllocale(1).
Przykłady:
# sortuj leksykalnie
@articles = sort @files;
# to samo, z jawną procedurą sortującą
@articles = sort {$a cmp $b} @files;
# teraz niewrażliwie na wielkość liter
@articles = sort {uc($a) cmp uc($b)} @files;
# to samo w odwrotnym porządku
@articles = sort {$b cmp $a} @files;
# sortuj rosnąco, numerycznie
@articles = sort {$a <=> $b} @files;
# j/w, malejąco
@articles = sort {$b <=> $a} @files;
# sortuj, używając jawnej nazwy podprocedury
sub byage {
$age{$a} <=> $age{$b}; # założenie numeryczności
}
@sortedclass = sort byage @class;
# to sortuje tablicę asocjacyjną %age według wartości (zamiast klucza)
# przy użyciu funkcji inline
@eldest = sort { $age{$b} <=> $age{$a} } keys %age;
sub backwards { $b cmp $a; }
@harry = ('dog','cat','x','Cain','Abel');
@george = ('gone','chased','yz','Punished','Axed');
print sort @harry;
# drukuje AbelCaincatdogx
print sort backwards @harry;
# drukuje xdogcatCainAbel
print sort @george, 'to', @harry;
# drukuje AbelAxedCainPunishedcatchaseddoggonetoxyz
# sortuj nieefektywnie według malejącego porównania numerycznego,
# używając pierwszej liczby całkowitej po znaku =, lub w przeciwnym
# wypadku cały rekord, bez zwracania uwagi na wielkość liter.
@new = sort {
($b =~ /=(\d+)/)[0] <=> ($a =~ /=(\d+)/)[0]
⎪⎪
uc($a) cmp uc($b)
} @old;
# to samo, dużo efektywniej;
# zbudujemy zewnętrzne indeksy
@nums = @caps = ();
for (@old) {
push @nums, /=(\d+)/;
push @caps, uc($_);
}
@new = @old[ sort {
$nums[$b] <=> $nums[$a]
⎪⎪
$caps[$a] cmp $caps[$b]
} 0..$#old
];
# to samo, przy użyciu Schwartzian Transform (bez tymczasowych)
@new = map { $_->[0] }
sort { $b->[1] <=> $a->[1]
⎪⎪
$a->[2] cmp $b->[2]
} map { [$_, /=(\d+)/, uc($_)] } @old;
Jeśli używasz strict, nie możesz deklarować $a i $b jako
leksykalia. Są one pakietowymi globaliami. Znaczy to, że
jeśli jesteś w pakiecie głównym (main), to jest to
@articles = sort {$main::b <=> $main::a} @files;
kub po prostu
@articles = sort {$::b <=> $::a} @files;
lecz jeśli jesteś w pakiecie FooPack, to jest to
@articles = sort {$FooPack::b <=> $FooPack::a} @files;
Funkcja porównująca musi się zachowywać [jednoznacznie].
Jeśli zwraca niespójne, nielogiczne wyniki (np. czasem
mówiąc, że $x[1] jest mniejsze niż $x[2], a czasem
odwrotnie), to interpreter perla prawdopodobnie się wysypie i zrzuci
core. Wynika to całkowicie z zależności od systemowej
funkcji bibliotecznej qsort(3); funkcja ta często nie dokonuje
pewnych sprawdzeń w celu polepszenia szybkości.
- splice TABLICA,OFFSET,DŁUGOŚĆ,LISTA
-
- splice TABLICA,OFFSET,DŁUGOŚĆ
-
- splice TABLICA,OFFSET
- Usuwa z tablicy elementy wskazane przez OFFSET i
DŁUGOŚĆ, oraz zamienia je ewentualnie podanymi elementami
LISTY. Zwraca elementy, które zostały z tablicy usunięte.
Tablica zgodnie z potrzebami rośnie, lub maleje. Jeśli parametr
DŁUGOŚĆ zostanie pominięty, to usuwane jest wszystko,
poczynając od OFFSET. A oto pewne równoważności
(zakładając, że $[ == 0):
push(@a,$x,$y) splice(@a,$#a+1,0,$x,$y)
pop(@a) splice(@a,-1)
shift(@a) splice(@a,0,1)
unshift(@a,$x,$y) splice(@a,0,0,$x,$y)
$a[$x] = $y splice(@a,$x,1,$y);
Przykład, przy założeniu, że długości tablic
są przekazywane przed tablicami:
sub aeq { # porównaj dwie wartości listowe
local(@a) = splice(@_,0,shift);
local(@b) = splice(@_,0,shift);
return 0 unless @a == @b; # ta sama długość?
while (@a) {
return 0 if pop(@a) ne pop(@b);
}
return 1;
}
if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... }
- split /WZORZEC/,WYRAŻ,LIMIT
-
- split /WZORZEC/,WYRAŻ
-
- split /WZORZEC/
-
- split
- Dzieli łańcuch na tablicę
łańcuchów i zwraca tę tablicę.
Jeśli nie jest w kontekście listowym, to zwraca listę
znalezionych pól i dzieli do tablicy @_. (w kontekście listowym
możesz wymusić dzielenie do @_, używając jako
rozdzielaczy wzorca ??, lecz będzie wciąż zwracać
wartość tablicową.) Używanie jawnego dzielenia do @_
nie jest jednak zalecane.
Jeśli WYRAŻ jest pominięty, dzielony jest łańcuch
$_. Jeśli pominięty jest też WZORZEC, dzielenie
następuje na białych spacjach (po pominięciu wszelkich
prowadzących białych spacji). Wszystko, odpowiadające
WZORCOWI jest uważane za rozdzielacz pól. (Zauważ, że
rozdzielacz może być dłuższy niż jeden znak.)
Jeśli podano wartość LIMIT i nie jest to liczba ujemna,
dzielenie następuje do nie więcej niż tej ilości
pól. Jeśli LIMIT nie jest podany, kończące
wypełnienia nullowe są obcinane (co dobrze pamiętać
użytkownikom pop()). Jeśli LIMIT jest ujemny, to jest
traktowany tak, jakby podano arbitralnie duży LIMIT.
Wzorzec, odpowiadający łańcuchowi null (żeby nie
być zmylonym ze wzorcem null //, który jest tylko jednym
członkiem z zestawu wzorców odpowiadających
łańcuchowi null) będzie dzielił wartość
WYRAŻ na oddzielne znaki w każdym punkcie, który odpowie
zapytaniu. Na przykład:
print join(':', split(/ */, 'hi there'));
da w wyniku 'h:i:t:h:e:r:e'.
Parametr LIMIT może być użyty do podzielenia linii
częściowo
($login, $passwd, $remainder) = split(/:/, $_, 3);
Podczas przypisywania do listy, jeśli nie podano LIMITU, perl ustawia
domyślny limit wielkości o 1 większej niż lista
zmiennych na liście, zapobiegając tak niepotrzebnej pracy. Dla
powyższej listy, LIMIT byłby ustawiony domyślnie na 4. W
aplikacjach, gdzie czas jest krytycznym czynnikiem, powstrzymuje cię
to od dzielenia na więcej pól, niż rzeczywiście
potrzebujesz.
Jeśli WZORZEC zawiera nawiasy, z łańcuchów
odpowiadającym podłańcuchom rozdzielacza tworzone są
dodatkowe elementy tablicy.
split(/([,-])/, "1-10,20", 3);
daje wartość listową
(1, '-', 10, ',', 20)
Jeśli masz cały nagłówek normalnego unixowego komunikatu
pocztowego w nagłówku $header, to możesz rozdzielić go
na pola i wartości w następujący sposób:
$header =~ s/\n\s+/ /g; # obsłuż linie kontynuacji
%hdrs = (UNIX_FROM => split /^(.*?):\s*/m, $header);
Wzorzec /WZORZEC/ może być zamieniony wyrażeniem,
umożliwiając tak podawanie wzorców, które
zmieniają się w czasie. (aby dokonać kompilacji czasu
działania tylko raz, użyj /$variable/o.)
Specjalnym przypadkiem jest podanie jako WZORZEC spacji (' '). Będzie
to powodować dzielenie na białych spacjach, podobnie jak
domyślna wersja split. Tak więc split(' ') może
być używany do domyślnego zachowania awk, gdzie
split(/ /) daje tyle łańcuchów null, ile jest
prowadzących białych spacji. Split dla /\s+/ jest podobny do
split(' '), lecz dowolna biała spacja powoduje null na
pierwszym polu. Split bez argumentów dokonuje w rzeczywistości
wewnętrznie split(' ', $_).
Przykład:
open(passwd, '/etc/passwd');
while (<passwd>) {
($login, $passwd, $uid, $gid, $gcos,
$home, $shell) = split(/:/);
...
}
(Zauważ, że $shell w powyższym będzie miał za
sobą nową linię. Aby ją usunąć, zapoznaj
się z funkcjami chop, chomp i join, opisanymi gdzieś w tym
dokumencie.)
- sprintf FORMAT, LISTA
- Zwraca łańcuch, sformatowany według
konwencji printf, funkcji bibliotecznej języka C, sprintf(3).
Perl emuluje funkcję C sprintf(), lecz nie używa jej (poza
liczbami zmiennoprzecinkowymi, a nawet wtedy dozwolone są tylko
standardowe modyfikatory). W wyniku, w perlu nie są dostępne
żadne niestandardowe rozszerzenia lokalnej wersji sprintf().
Perlowy sprintf() zezwala na następujące, ogólnie
znane konwersje:
%% znak procentu
%c znak o podanym kodzie
%s łańcuch
%d integer ze znakiem, dziesiętnie
%u integer bez znaku, dziesiętnie
%o integer bez znaku, ósemkowo
%x integer bez znaku, szesnastkowo
%e liczba zmiennoprzecinkowa w notacji naukowej
%f liczba zmiennoprzecinkowa w ustalonej notacji dziesiętnej
%g liczba zmiennoprzecinkowa w notacji %e lub %f
Dodatkowo, perl zezwala na następujące szeroko-obsługiwane
konwersje:
%X podobne do %x, lecz na dużych literach
%E podobne do %e, lecz z użyciem dużego E
%G podobne do %g, lecz z użyciem dużego E
%p wskaźnik (daje adres wartości, podany szesnastkowo)
%n specjalne: przechowuje liczbę dotychczas wpisanych do następnej
zmiennej z listy parametrów
I w końcu, dla kompatybilności wstecznej, perl zezwala na
poniższe zbyteczne, lecz szeroko obsługiwane konwersje:
%i synonim %d
%D synonim %ld
%U synonim %lu
%O synonim %lo
%F synonim %f
Perl zezwala na użycie następujących uniwersalnych flag
między znakiem %, a literą konwersji:
spacja poprzedź liczbę dodatnią spacją
+ poprzedź liczbę dodatnią plusem
- wyrównuj do lewej w obszarze pola
0 użyj zer zamiast spacji do wyrównywania w prawo
# poprzedź liczbę ósemkową "0", szesnastkową "0x"
liczba minimalna wielkość pola
.liczba "precyzja": liczba cyfr po kropce dziesiętnej dla
zmiennoprzecinkowych, maksymalna długość dla łańcucha, lub
minimalna długość dla liczby całkowitej (integer)
l interpretuj integer jak typ C "long", lub "unsigned long"
h interpretuj integer jak typ C "short", lub "unsigned short"
Istnieje też jedna flaga specyficzna dla perla:
V interpretuj integer jako standardowy typ integera w perlu
Tam, gdzie we flagach pojawia się liczba, można użyć
gwiazdki ("*"). W tym wypadku perl używa zamiast liczby
wartości następnego argumentu z listy parametrów.
Jeśli szerokość pola, uzyskana przez "*" jest
ujemna, to ma to samo działanie, co flaga '-': wyrównywanie do
lewej.
Jeśli działa use locale, znaki używane do kropki
dziesiętnej będą drukowane według locale LC_NUMERIC.
Zobacz stronę perllocale(1).
- sqrt WYRAŻ
-
- sqrt
- Zwraca pierwiastek kwadratowy z WYRAŻ. Jeśli
WYRAŻ jest pominięte, zwraca wartość dla $_.
- srand WYRAŻ
-
- srand
- Ustawia nasionko liczby losowej dla operatora rand.
Jeśli pominięte zostanie WYRAŻ, używana jest
pseudolosowa wartość, oparta o bieżący czas i
identyfikator procesu. W wersjach perla wcześniejszych niż
5.004, domyślnym nasionkiem był po prostu bieżący czas
time(). Nie jest to szczególnie dobre nasionko, więc
wiele starych programów załączało swoją
własną wartość inicjującą (często time
^ $$, lub C<time ^ ($$ + ($$ << 15))>), lecz teraz nie jest to
konieczne.
W rzeczywistości, zazwyczaj w ogóle nie jest konieczne
wywoływanie srand, ponieważ jest ono wywoływane
niejawnie przy pierwszym użyciu operatora rand. Jednak nie było
tak w wersjach wcześniejszych niż perl 5.005, więc
jeśli twój skrypt ma działać ze starszymi wersjami,
powinien jednak wołać srand().
Zauważ, że dla potrzeb kryptografii potrzebujesz czegoś
więcej niż tylko wylosować domyślne nasionko.
Popularną metodą jest sprawdzanie sum kontrolnych
skompresowanego wyjścia z jednego, lub więcej programów
szybko zmieniającego się statusu systemu operacyjnego. Na
przykład:
srand (time ^ $$ ^ unpack "%L*", `ps axww ⎪ gzip`);
Jeśli naprawdę ci na tym zależy, zobacz moduł
Math::TrulyRandom w CPAN.
Nie wołaj srand() wielokrotnie, chyba że
dokładnie wiesz co i w jakim celu robisz. Celem tej funkcji jest
zasilenie funkcji rand() tak, by rand() zwracał
inną sekwencję dla każdego uruchomienia programu. Zrób
to raz, na samym początku programu, bo w przeciwnym wypadku
nie uzyskasz z rand() liczb losowych!
Często wywoływane programy (takie jak skrypty CGI), które
jako nasionka używają po prostu
time ^ $$
mogą paść ofiarą własności matematycznej,
że
a^b == (a+1)^(b+1)
przez jedną trzecią czasu. Więc nie rób tego.
- stat UCHWYTPLIKU
-
- stat WYRAŻ
-
- stat
- Zwraca 13 elementową tablicę, opisującą
status pliku--otwartego przez UCHWYTPLIKU lub nazwanego przez WYRAŻ.
Jeśli WYRAŻ jest pominięte, używany jest $_. Gdy
funkcja zawiedzie, zwraca listę null. Zazwyczaj jest to używane
następująco:
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
= stat($filename);
Nie wszystkie z tych pól są obsługiwane na wszystkich
rodzajach systemów plików. Oto znaczenia pól:
0 dev numer urządzenia systemu plików
1 ino numer inode
2 mode prawa pliku (typ i prawa)
3 nlink liczba twardych dowiązań do pliku
4 uid numeryczny UID właściciela
5 gid numeryczny GID właściciela
6 rdev identyfikator urządzenia (tylko dla plików specjalnych)
7 size całkowity rozmiar w bajtach
8 atime ostatni dostęp od epoki
9 mtime ostatnia modyfikacja od epoki
10 ctime ostatnia zmiana inode od epoki
11 blksize preferowany rozmiar bloku dla I/O systemu plików
12 blocks rzeczywista liczba zaalokowanych bloków
(Epoka nastąpiła o 00:00 1 stycznia, 1970 GMT.)
Jeśli funkcja dostanie specjalny uchwyt pliku, składający
się z podkreślenia, to nie jest ona wykonywana, lecz
przekazywana jest zawartość ostatniego testu pliku.
Przykład:
if (-x $file && (($d) = stat(_)) && $d < 0) {
print "$file jest wykonywalnym plikiem NFS\n";
}
(Działa to tylko na maszynach, dla których numer urządzenia
jest ujemny dla NFS.)
- study SKALAR
-
- study
- Zajmuje trochę czasu, by przestudiować SKALAR
(lub $_, jeśli go nie podano), przygotowując się na wiele
przeszukiwań wzorców na tym łańcuchu, przed jego
kolejną modyfikacją. Może to pozwolić zyskać na
czasie, zależnie od natury i liczby wzorców, a także od
rozłożenia częstotliwości znaków w przeszukiwanym
łańcuchu. Najlepiej sprawdzić empirycznie, czy funkcja ta
wpływa na szybkość dodatnio, czy ujemnie. Najwięcej
zyskają pętle, szukające wielu krótkich, stałych
łańcuchów (włączając stałe
części bardziej złożonych wzorców). Naraz
można mieć obsługiwany przez study tylko jeden
łańcuch. Jeśli przejdziesz na inny skalar, to poprzedni
stanie się nieprzestudiowany. (study działa
następująco: najpierw robiona jest lista powiązana dla
każdego znaku przeszukiwanego łańcucha, tak że wiemy
na przykład gdzie znajdują się wszystkie znaki 'k'. W
każdym szukanym łańcuchu wybierany jest w oparciu o
statyczne tablice rozkładu najrzadziej występujący znak.
Łańcuch jest poszukiwany w miejscach, gdzie znajduje się
ten najrzadszy znak.)
Na przykład oto pętla, która wstawia wpisy tworzące
indeks przed każdą linię, zawierającą
określony wzorzec:
while (<>) {
study;
print ".IX foo\n" if /\bfoo\b/;
print ".IX bar\n" if /\bbar\b/;
print ".IX blurfl\n" if /\bblurfl\b/;
...
print;
}
Użycie study spowoduje szukanie /\bfoo\b/ tylko w miejscach $_,
które zawierają "f", gdyż jest to najrzadszy
znak. Ogólnie, daje to duże zyski, poza przypadkami
patologicznymi. Jedynym pytaniem jest to, czy zachowuje ci to więcej
czasu niż zabrało zbudowanie powiązanej listy.
Zauważ, że jeśli musisz szukać łańcuchów,
o których nic nie wiesz, aż do uruchomienia, to możesz
zbudować całą pętlę jako łańcuch i
evalować to, by zapobiec ciągłemu rekompilowaniu
wzorców. W połączeniu z czynieniem $/ niezdefiniowanym, aby
wessać całe pliki jako jeden rekord, może to być
bardzo szybkie, często szybsze niż specjalizowane programy typu
fgrep(1). Następujący przykład skanuje listę
plików (@files) w poszukiwaniu listy słów (@words) i
drukuje nazwy plików, zawierających odpowiednik:
$search = 'while (<>) { study;';
foreach $word (@words) {
$search .= "++\$seen{\$ARGV} if /\\b$word\\b/;\n";
}
$search .= "}";
@ARGV = @files;
undef $/;
eval $search; # to krzyczy
$/ = "\n"; # ustaw normalny rozdzielacz wejścia
foreach $file (sort keys(%seen)) {
print $file, "\n";
}
- sub BLOK
-
- sub NAZWA
-
- sub NAZWA BLOK
- Nie jest to prawdziwa funkcja, lecz definicja podprocedury.
Jeśli zawiera tylko NAZWĘ (i przypuszczalnie prototypy), jest to
tylko deklaracja. Bez NAZWY jest to deklaracja anonimowej funkcji i zwraca
wartość: referencję CODE zawężenia, które
właśnie utworzyłeś. Dla dalszych
szczegółów, zobacz stronę podręcznika
perlref(1).
- substr WYRAŻ,OFFSET,DŁUGOŚĆ
-
- substr WYRAŻ,OFFSET
- Wyciąga z WYRAŻ podłańcuch i zwraca go.
Pierwszy znak znajduje się pod offsetem 0, lub tym, na co
ustawiłeś $[ (lecz nie rób tego). Jeśli OFFSET jest
ujemny, rozpoczyna się w tej odległości od końca
łańcucha. Jeśli DŁUGOŚĆ jest pominięta,
zwracane jest wszystko, aż do końca łańcucha.
Jeśli DŁUGOŚĆ jest ujemna, pozostawia tyle znaków
z końca łańcucha.
Funkcji substr() możesz użyć jako lwartości, w
którym wypadku WYRAŻ musi być lwartością.
Jeśli przyznasz coś krótszego niż
DŁUGOŚĆ, łańcuch zostanie skrócony, a
jeśli coś dłuższego, to łańcuch zostanie
rozciągnięty. Aby zachować stałą
długość łańcucha, możesz potrzebować
dopełnić, lub obciąć wartości przy użyciu
sprintf().
- symlink STARYPLIK,NOWYPLIK
- Tworzy nową nazwę pliku, dowiązaną
symbolicznie do starej. Po sukcesie zwraca 1, w przeciwnym wypadku 0. Na
systemach nie obsługujących dowiązań symbolicznych,
funkcja ta powoduje błąd krytyczny podczas działania. Aby
go wychwycić, użyj eval:
$symlink_exists = (eval {symlink("","")};, $@ eq '');
- syscall LISTA
- Wywołuje wywołanie systemowe, podane jako
pierwszy element listy, przekazując resztę elementów jako
argumenty wywołania. Jeśli nie jest to zaimplementowane,
powoduje błąd krytyczny. Argumenty są interpretowane
następująco: jeśli podany argument jest numeryczny,
przekazywany argument to int. Jeśli nie, przekazywany jest
wskaźnik do wartości tekstowej. Odpowiadasz za upewnienie
się, że łańcuch jest dość długi, by
odebrać określony wynik, który może być do niego
zapisany. Jeśli twoje argumenty int nie są literałami i nie
były nigdy interpretowane w kontekście numerycznym, możesz
być zmuszonym dodać do nich 0, aby wymusić na nich
wygląd liczbowy.
require 'syscall.ph'; # może być niezbędne h2ph
syscall(&SYS_write, fileno(STDOUT), "hi there\n", 9);
Zauważ, że perl obsługuje przekazywanie do 14 argumentów
do wywołania systemowego, co w praktyce powinno wystarczyć.
- sysopen UCHWYTPLIKU,NAZWAPLIKU,TRYB
-
- sysopen UCHWYTPLIKU,NAZWAPLIKU,TRYB,PRAWA
- Otwiera plik NAZWAPLIKU i wiąże go z
UCHWYTEMPLIKU. Jeśli UCHWYTPLIKU jest wyrażeniem, to jego
wartość jest używana jako nazwa rzeczywistego uchwytu
pliku. Funkcja ta woła podlegającą jej funkcję systemu
operacyjnego, open z parametrami NAZWAPLIKU, TRYB, PRAWA.
Prawidłowe wartości i bity flag parametru TRYB są
zależne od systemu; są one dostępne przez standardowy
moduł Fcntl. Jednak z przyczyn historycznych, niektóre
wartości są uniwersalne; zero oznacza tylko dla odczytu, jeden
tylko dla zapisu, a dwa dla zapisu i odczytu.
Jeśli plik NAZWAPLIKU nie istnieje, a wywołanie open go tworzy
(zazwyczaj dlatego, że TRYB zawiera flagę O_CREAT), to
wartość PRAW określa prawa nowo utworzonego pliku.
Jeśli są one pominięte, używana jest domyślna
wartość 0666, która umożliwia wszystkim odczyt i
zapis. Wartość ta ma sens, zobacz umask.
Moduł IO::File daje bardziej obiektowe podejście do tych rzeczy.
- sysread
UCHWYTPLIKU,SKALAR,DŁUGOŚĆ,OFFSET
-
- sysread UCHWYTPLIKU,SKALAR,DŁUGOŚĆ
- Próbuje odczytać DŁUGOŚĆ
bajtów danych do zmiennej SKALAR. Odczyt następuje z pliku
wskazywanego przez UCHWYTPLIKU, przy użyciu wywołania
systemowego read(2). Pomija to stdio, więc łączenie
tej funkcji z innym rodzajami odczytu, z print(), write(),
seek(), lub tell() może powodować problemy. Zwraca
ilość odczytanych bajtów, lub undef w wypadku
błędu. SKALAR będzie rozciągany tak, by pasował
do liczby odczytanych bajtów.
Aby spowodować odczyt danych z któregoś miejsca
łańcucha (różnego niż początek), można
podać dodatkowo parametr OFFSET. Jeśli parametr ten jest ujemny,
to wskazywana jest pozycja przesunięta o tyleż bajtów w
tył od końca łańcucha. Jeśli dodatni offset jest
większy od długości SKALARA, to wynikiem jest
wypełnienie do wymaganego rozmiaru znakami "\-", a
następnie doklejenie odczytu.
- sysseek UCHWYTPLIKU,POZYCJA,GDZIE
- Zmienia pozycję UCHWYTUPLIKU przy użyciu
wywołania systemowego lseek(2). Pomija stdio, więc
łączenie tego z odczytami (innymi niż sysread()), z
print(), write(), seek(), lub tell() może
wprowadzić problemy. UCHWYTPLIKU może być wyrażeniem,
którego wartość daje nazwę uchwytu pliku.
Wartości dla GDZIE to 0 dla ustawienia nowej pozycji, 1 dla dodania
nowej pozycji do bieżącej i 2 do ustawienia pozycji EOF plus
offset. Dla parametru GDZIE można używać stałych
SEEK_SET, SEEK_CUR i SEEK_END z modułu IO::Seekable lub POSIX.
Zwracana jest nowa pozycja, lub wartość niezdefiniowana w wypadku
błędu. Pozycja zerowa zwracana jest jako łańcuch
"0 but true"; tak więc sysseek() zwraca TRUE po
sukcesie i FALSE po błędzie, lecz wciąż możesz
łatwo ustalić nową pozycję.
- system LISTA
- Robi dokładnie to samo, co "exec LISTA",
poza tym, że dokonuje przed tym forka i proces rodzicielski czeka,
aż dziecko dokona żywota. Zauważ, że przetwarzanie
argumentów różni się, zależnie od liczby
argumentów. Wartość zwracana jest statusem wyjścia
programu, zwróconym przez wywołanie wait(). Aby
uzyskać rzeczywistą wartość wyjścia, podziel
ją przez 256. Zobacz też opis exec, znajdujący się
gdzieś w tym dokumencie. Nie jest to sposób, którego
należy używać do przechwytywania wyjścia z komendy,
dla tego celu użyj zwykłych odwróconych apostrofów
(backticks?) lub qx//, jak opisano w sekcji `ŁAŃCUCH`
podręcznika perlop(1).
Ponieważ zarówno system() i odwrotne apostrofy blokują
SIGINT i SIGQUIT, ubicie ich nie powoduje przerwania twojego programu.
@args = ("command", "arg1", "arg2");
system(@args) == 0
or die "system @args się nie powiódł: $?"
A oto bardziej wyrafinowany przykład analizowania wartości
zwracanej przez system(). Ma to miejsce na systemie unixowym i jest
robione, aby sprawdzić wszystkie możliwości,
włącznie z sygnałami i zrzutami core.
$rc = 0xffff & system @args;
printf "system(%s) zwrócił %#04x: ", "@args", $rc;
if ($rc == 0) {
print "normalne zakończenie\n";
}
elsif ($rc == 0xff00) {
print "komenda się nie powiodła: $!\n";
}
elsif ($rc > 0x80) {
$rc >>= 8;
print "niezerowy status wyjścia $rc\n";
}
else {
print "skończył z ";
if ($rc & 0x80) {
$rc &= ~0x80;
print "zrzutem core z ";
}
print "sygnałem $rc\n"
}
$ok = ($rc != 0);
- syswrite
UCHWYTPLIKU,SKALAR,DŁUGOŚĆ,OFFSET
-
- syswrite UCHWYTPLIKU,SKALAR,DŁUGOŚĆ
- Próbuje zapisać DŁUGOŚĆ
bajtów ze SKALARA do pliku podanego przez UCHWYTPLIKU przy
użyciu wywołania systemowego write(2). Pomija stdio,
więc łączenie tego z odczytami (innymi niż
sysread()), z print(), write(), seek(), lub
tell() może spowodować problemy. Zwraca liczbę
zapisanych bajtów, lub undef w wypadku błędu. Jeśli
długość jest większa niż dostępne dane,
zapisywanych jest tylko tyle danych, ile jest dostępnych.
Dodatkowo można podać OFFSET, aby zapisać dane z jakiejś
części łańcucha, która nie jest początkiem.
Ujemna wartość offsetu nakazuje zapisywanie od miejsca,
przesuniętego o tyle bajtów od końca łańcucha.
- tell UCHWYTPLIKU
-
- tell
- Zwraca bieżącą pozycję pliku dla
UCHWYTUPLIKU. UCHWYTPLIKU może być wyrażeniem, którego
wartość podaje nazwę rzeczywistego uchwytu pliku.
Jeśli UCHWYTPLIKU jest pominięty, zakładany jest plik, z
którego ostatnio czytano.
- telldir UCHWYTKATALOGU
- Zwraca bieżącą pozycję funkcji
readdir() dla UCHWYTUKATALOGU. Do seekdir() można
przekazać wartość, każącą osiągnąc
określoną pozycję w katalogu.
- tie ZMIENNA,NAZWAKLASY,LISTA
- Funkcja ta łączy zmienną z klasą
pakietu, która opisuje jej implementację. ZMIENNA jest
nazwą czarowanej zmiennej. NAZWAKLASY jest nazwą klasy,
implementującej obiekty właściwego typu. Wszelkie dodatkowe
argumenty są przekazywane metodzie "new" klasy (czyli
TIESCALAR, TIEARRAY, lub TIEHASH). Zazwyczaj, argumenty te
wyglądają tak, jak te, które są przekazywane funkcji
dbm_open() z C. Obiekt, zwrócony przez metodę
"new" jest też zwracany przez tie(), co jest
przydatne, jeśli chcesz dostać się do innych metod w
NAZWIEKLASY.
Zauważ, że funkcje takie, jak keys() i valuse()
mogą zwracać wielkie wartości tablicowe, jeśli
użyć je na dużych obiektach, takich jak pliki DBM. Lepiej
może być użyć funkcji each() i na nich
iterować. Przykład:
# drukuj offsety pliku historii
use NDBM_File;
tie(%HIST, 'NDBM_File', '/usr/lib/news/history', 1, 0);
while (($key,$val) = each %HIST) {
print $key, ' = ', unpack('L',$val), "\n";
}
untie(%HIST);
Klasa, implementująca tablicę asocjacyjną, powinna mieć
następujące metody:
TIEHASH classname, LIST
DESTROY this
FETCH this, key
STORE this, key, value
DELETE this, key
EXISTS this, key
FIRSTKEY this
NEXTKEY this, lastkey
Klasa, implementująca zwykłą tablicę, powinna mieć
następujące metody:
TIEARRAY classname, LIST
DESTROY this
FETCH this, key
STORE this, key, value
[others TBD]
Klasa, implementująca skalar, powinna mieć następujące
metody:
TIESCALAR classname, LIST
DESTROY this
FETCH this,
STORE this, value
W przeciwieństwie do funkcji dbmopen(), funkcja tie() nie
używa, lub wymaga dla ciebie modułów (use, require)--musisz
o to zadbać samodzielnie. Zobacz podręcznik DB_File oraz
moduł Config dla interesujących implementacji
tie().
- tied ZMIENNA
- Zwraca referencję do obiektu kryjącego się
pod ZMIENNĄ (wartość, która była początkowo
zwrócona przez tie(), które powiązał
zmienną z pakietem.) Gdy ZMIENNA nie jest powiązana, zwracana
jest wartość niezdefiniowana.
- time
- Zwraca liczbę sekund od początku epoki (tj. na
MacOs od 00:00:00, 1 Stycznia, 1904, a od 00:00:00 UTC, 1 Stycznia, 1970
dla większości innych systemów). Wystarczające do
przekazania dla gmtime() lub localtime().
- times
- Zwraca czteroelementową tablicę,
podającą w sekundach czasy użytkownika i systemu.
Wartości są dla tego procesu, oraz dla dzieci tego procesu.
($user,$system,$cuser,$csystem) = times;
- tr///
- Operator translacji. To samo co y///. Zobacz stronę
perlop(1).
- truncate UCHWYTPLIKU,DŁUGOŚĆ
-
- truncate WYRAŻ,DŁUGOŚĆ
- Skraca plik, otwarty na UCHWYCIEPLIKU lub nazwany przez
WYRAŻ do podanej długości. Na systemach, gdzie nie jest to
zaimplementowane, powoduje błąd krytyczny.
- uc WYRAŻ
-
- uc
- Zwraca WYRAŻ w dużych literach. Jest to funkcja
wewnętrzna, implementująca escape \U na łańcuchach
ujętych w podwójne cudzysłowy. Szanuje bieżące
ustawienie LC_CTYPE, jeśli włączono use locale. Zobacz
podręcznik perllocale(1).
Jeśli WYRAŻ jest pominięte, używa $_.
- ucfirst WYRAŻ
-
- ucfirst
- Zwraca WYRAŻ, z pierwszym znakiem zmienionym na
dużą literę. Jest to funkcja wewnętrzna,
implementująca escape \u na łańcuchach ujętych w
cudzysłowy. Szanuje bieżące ustawienie LC_CTYPE, jeśli
włączono use locale. Zobacz podręcznik
perllocale(1).
If EXPR is omitted, uses $_.
- umask WYRAŻ
-
- umask
- Ustawia umaskę procesu na WYRAŻ i zwraca
wartość poprzednią. Jeśli WYRAŻ jest
pominięte, po prostu zwraca bieżącą umaskę.
Pamiętaj, że umaska jest liczbą, zazwyczaj podawaną
ósemkowo; nie jest łańcuchem cyfr ósemkowych.
Zobacz opis oct, znajdujący się gdzieś w tym dokumencie,
jeśli masz tylko łańcuch.
- undef WYRAŻ
-
- undef
- Powoduje, że wartość WYRAŻ, która
musi być lwartością, staje się niezdefiniowana.
Używaj tego tylko na wartościach skalarnych, całej tablicy,
całej tablicy asocjacyjnej, lub na nazwie podprocedury (przy
użyciu "&"). (Używanie tej funkcji w innych
wypadkach przypuszczalnie nie doprowadzi do takich rezultatów, jakich
można by oczekiwać.) Zawsze zwraca wartość
niezdefiniowaną. Możesz pominąć WYRAŻ--w tym
wypadku nic nie jest pozbawiane zdefiniowania, lecz mimo to uzyskujesz
wartość niezdefiniowaną, którą możesz np.
zwrócić z podprocedury, przypisać zmiennej,lub
przekazać jako parametr. Przykłady:
undef $foo;
undef $bar{'blurfl'}; # Porównaj z: delete $bar{'blurfl'};
undef @ary;
undef %hash;
undef &mysub;
return (wantarray ? (undef, $errmsg) : undef) if $they_blew_it;
select undef, undef, undef, 0.25;
($a, $b, undef, $c) = &foo; # Ignoruj trzecią zwróconą wartość
- unlink LISTA
-
- unlink
- Kasuje listę plików. Zwraca liczbę
skasowanych plików.
$cnt = unlink 'a', 'b', 'c';
unlink @goners;
unlink <*.bak>;
Uwaga: unlink nie skasuje katalogów, chyba że jesteś
superużytkownikiem i przekazałeś perlowi flagę
-U. Nawet gdy te warunki są spełnione, bądź
ostrzeżony, że skasowanie katalogu może wywołać
uszkodzenie systemu plików. Zamiast tego użyj rmdir.
Jeśli LISTA jest pominięta, używa $_.
- unpack WZORZEC,WYRAŻ
- Unpack robi odwrotność tego, co pack: pobiera
łańcuch, reprezentujący strukturę i rozwija go na
listę wartości, zwracają wartość tablicową
(w kontekście skalarnym zwraca tylko pierwszą wartość
tablicy). WZORZEC jest tego samego formatu co dla funkcji pack. Oto
podprocedura, która dokonuje substringu:
sub substr {
local($what,$where,$howmuch) = @_;
unpack("x$where a$howmuch", $what);
}
a potem mamy
sub ordinal { unpack("c",$_[0]); } # to samo co ord()
Dodatkowo, możesz poprzedzić pola %<liczbą>,
wskazując, że chcesz <liczba>-bitową sumę
szesnastkową elementów, zamiast samych elementów.
Domyślna jest suma 16-bitowa. Na przykład, następujący
przykład oblicza tę samą liczbę co program sum z
Systemu V:
while (<>) {
$checksum += unpack("%16C*", $_);
}
$checksum %= 65536;
Następujący fragment efektywnie oblicza liczbę ustawionych
bitów w wektorze bitowym:
$setbits = unpack("%32b*", $selectmask);
- untie ZMIENNA
- Rozbija powiązanie między zmienną, a
pakietem. Zobacz tie().
- unshift TABLICA,LISTA
- Robi odwrotną rzecz do shift. Lub odwrotną do
push, zależnie jak na to spojrzeć. Dokleja listę do
początku tablicy i zwraca nową liczbę elementów.
unshift(ARGV, '-e') unless $ARGV[0] =~ /^-/;
Zauważ, że LISTA jest doklejana cała, a nie jeden element
naraz, więc doklejone elementy pozostają w tej samej
kolejności. Aby ją odwrócić, użyj reverse.
- use Module LISTA
-
- use Module
-
- use Module WERSJA LISTA
-
- use WERSJA
- Importuje semantykę danego modułu do
bieżącego pakietu. Ogólnie aliasuje określone
podprocedury lub nazwy zmiennych do twojego pakietu. Jest to
dokładnie równoważne
BEGIN { require Module; import Module LIST; }
poza tym, że Module musi być gołym słowem.
Jeśli pierwszy argument use jest liczbą, to jest ona traktowana
jako numer wersji, zamiast nazwa modułu. Jeśli wersja
interpretera perla jest mniejsza niż WERSJA, to wyświetlony
zostanie komunikat o błędzie, a perl natychmiast zakończy
działanie. Jest to często przydatne, jeśli chcesz
sprawdzić wersję perla przed używaniem modułów
bibliotecznych, które zmieniły się w sposób
niekompatybilny od czasu starszych wersji perla. (staramy się by tak
nie było.)
Słowo BEGIN wymusza by require i import zaszły podczas kompilacji.
Require zapewnia, że moduł będzie załadowany do
pamięci, jeśli wcześniej nie był. Import nie jest
wbudowany--jest to tylko zwykłe, statyczne wywołanie metody
pakietu "Module" aby powiedzieć modułowi, by
zaimportował listę właściwości do pakietu
bieżącego. Moduł może implementować swoją
metodę import w dowolny sposób, choć
większość modułów woli wyprowadzać
swoją metodę poprzez dziedziczenie z klasy Exporter,
zdefiniowanej w module Exporter, Zobacz podręcznik Exporter.
Jeśli nie ma żadnej metody importującej, to błąd
jest cicho ignorowany. Może się to w przyszłych wersjach
zmienić na błąd krytyczny.
Jeśli nie chcesz zmieniania swojej przestrzeni nazw, załącz
jawnie pustą listę:
use Module ();
Jest to dokładnie równoważne
BEGIN { require Module; }
Jeśli między Module, a LISTA jest obecny argument WERSJA, to use
wywoła metodę VERSION klasy Module z podaną wersją,
jako argumentem. Domyślna metoda VERSION, dziedziczona z klasy
Universal, zakracze jeśli podana wersja jest większa niż
wartość zmiennej $Module::VERSION. (Zauważ, że nie ma
przecinka po WERSJI!)
Ponieważ jest to szeroko otwarty interfejs, można tak
implementować też pragmy (dyrektywy kompilatora). Obecnie
zaimplementowane pragmy to:
use integer;
use diagnostics;
use sigtrap qw(SEGV BUS);
use strict qw(subs vars refs);
use subs qw(afunc blurfl);
Te pseudo moduły importują semantykę do bieżącego
zakresu bloku, w przeciwieństwie do zwykłych modułów,
które importują symbole do bieżącego pakietu.
Istnieje odpowiadająca komenda "no", która de-importuje
rzeczy zaimportowane przez use, np. wywołuje metodę unimport
Module LISTA zamiast import.
no integer;
no strict 'refs';
Jeśli nie ma metody unimport, wywołanie to kończy się
błędem krytycznym.
Dla listy standardowych modułów i pragm, zobacz podręcznik
perlmod.
- utime LISTA
- Zmienia czasy dostępu i modyfikacji na każdym
pliku z listy. Pierwsze dwa elementy listy muszą być
numerycznymi czasami dostępu i modyfikacji, dokładnie w tej
kolejności. Zwraca liczbę plików, na których operacja
się powiodła. Czas modyfikacji inode jest ustawiany na czas
bieżący. Przykład komendy "touch":
#!/usr/bin/perl
$now = time;
utime $now, $now, @ARGV;
- values HASH
- Zwraca normalną tablicę,
składającą się ze wszystkich wartości wymienionej
tablicy asocjacyjnej. W kontekście skalarnym, zwracana jest liczba
wartości. Wartości są zwracane w dość losowej
kolejności, lecz jest ona ta sama, co zwracana przez funkcje
keys() lub each(). Jako efekt uboczny, funkcja resetuje
iterator tablicy asocjacyjnej. Zobacz też keys(),
each(), i sort().
- vec WYRAŻ,OFFSET,BITY
- Traktuje łańcuch WYRAŻ jako wektor
całkowitych integerów i zwraca wartość pola bitowego,
wskazanego przez OFFSET. BITY podają liczbę bitów,
które są zarezerwowane dla każdego wpisu w wektorze
bitowym. Musi to być potęga dwójki do 1 do 32. vec
może też być przypisany do czegoś--w tym wypadku
potrzebne są nawiasy, aby nadać wyrażeniu
właściwy priorytet, jak w
vec($image, $max_x * $x + $y, 8) = 3;
Wektory utworzone przez vec() mogą też być
obsługiwane przez operatory logiczne ⎪, & i ^, które
założą, że bitowa operacja wektorowa jest oczekiwana
gdy obydwa operandy są łańcuchami.
Aby przekształcić wektor bitowy na tablicę
łańcuchową zer i jedynek, użyj:
$bits = unpack("b*", $vector);
@bits = split(//, unpack("b*", $vector));
Jeśli znasz dokładną długość w bitach,
możesz podać ją zamiast *.
- wait
- Czeka, aż proces potomny się nie zakończy i
zwraca pid zamkniętego procesu, lub -1, jeśli go nie było.
Status jest zwracany w $?.
- waitpid PID,FLAGI
- Czeka, aż proces potomny się zakończy i
zwraca pid zamkniętego procesu, lub -1, jeśli nie było
takiego procesu. Status jest zwracany w $?. Jeśli powiesz
use POSIX ":sys_wait_h";
...
waitpid(-1,&WNOHANG);
to możesz dokonać nieblokującego oczekiwania na dowolny
proces. Nieblokujące oczekiwanie jest dostępne na maszynach,
obsługujących albo wywołanie waitpid(2), albo
wait4(2). Jednak oczekiwanie na konkretny pid z FLAGAMI
wartości 0 jest zaimplementowane wszędzie. (Perl emuluje
wywołanie systemowe, pamiętając wartości statusu
procesów, które zakończyły się, lecz nie
były odczytane przez skrypt perla)
- wantarray
- Zwraca TRUE, jeśli kontekst obecnie wykonywanej
podprocedury szuka wartości listowej. Zwraca FALSE, jeśli
kontekst szuka skalara. Zwraca wartość niezdefiniowaną,
jeśli kontekst nie szuka wartości (void).
return unless defined wantarray; # nie myśl o robieniu więcej
my @a = complex_calculation();
return wantarray ? @a : "@a";
- warn LIST
- Produkuje komunikat na STDERR, podobnie jak die(),
lecz nie wychodzi i nie wyrzuca wyjątku.
Jeśli zainstalowany jest handler $SIG{__WARN__), nie są drukowane
żadne komunikaty. Od handlera zależy obsługa komunikatu,
gdy tak zadecyduje (np. przekonwertowanie go na die()).
Większość handlerów musi więc wywoływać
warn() ponownie, aby wyświetlić komunikat. Zauważ,
że jest to bezpieczne i nie spowoduje nieskończonej pętli,
gdyż haki __WARN__ nie są wołane z niego samego.
Zachowanie to jest trochę inne od tego dla $SIG{__DIE__} (które
nie powstrzymywały tekstu komunikatów, lecz mogły
wywołać die() ponownie, aby je zmienić).
Używanie handlerów __WARN__ daje potężne narzędzie
do wyciszania wszystkich ostrzeżeń (nawet tak zwanych
obowiązkowych). Na przykład:
# wywal wszystkie ostrzeżenia czasu kompilacji
BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] if $DOWARN } }
my $foo = 10;
my $foo = 20; # bez ostrzegania o zduplikowaniu my $foo
# lecz przecież sam się o to prosiłeś!
# bez ostrzeżeń czasu kompilacji i czasu działania przed tym miejscem
$DOWARN = 1;
# ostrzeżenia czasu działania są tu włączone
warn "\$foo is alive and $foo!"; # pojawia się
Zobacz stronę perlvar(1) dla szczegółów o
ustawianiu wpisów %SIG i dla przykładów.
- write UCHWYTPLIKU
-
- write WYRAŻ
-
- write
- Zapisuje sformatowany rekord (prawdopodobnie wieloliniowy)
do podanego pliku, używając formatu związanego z tym
plikiem. Domyślnie format dla pliku jest tym, który ma tę
samą nazwę, co uchwyt pliku, lecz można go zmienić z
pomocą funkcji select(), przypisując nazwę formatu
zmiennej $~.
Początek przetwarzania formy jest obsługiwany automatycznie:
jeśli nie ma miejsca na stronie na sformatowany rekord, to strona
jest przewijana przez wpisanie form feed, następnie używany jest
specjalny format góry-strony (do formatowania nagłówka
nowej strony), a potem wpisany jest rekord. Domyślnie, format
góry-strony jest nazwą uchwytu pliku z dodanym "_TOP",
lecz można go ustawić dynamicznie, przyznając zmiennej $^
nazwę podczas gdy wybrany (select) jest uchwyt pliku. Liczba
pozostających linii bieżącej strony znajduje się w
zmiennej $- i może być ustawiona na 0 aby wymusić nową
stronę.
Jeśli UCHWYTPLIKU nie jest podany, wyjście idzie do
bieżącego domyślnego kanału wyjścia, którym
jest początkowo STDOUT, a który może być zmieniony
operatorem select. Jeśli UCHWYTPLIKU jest wyrażeniem WYRAŻ,
to jest ono analizowane, a wynikowy łańcuch jest używany do
podejrzenia nazwy UCHWYTUPLIKU. Dla dalszych informacji o formatach,
zobacz stronę perlform(1).
Zauważ, że zapis NIE jest odwrotnością odczytu.
Niestety.
- y///
- Operator translacji. To samo co tr///. Zobacz stronę
perlop(1).