Provided by:
manpages-pl_20060617-2_all 
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:
WYGLDA 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 OGLNA REGUA 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 czyci 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 `ACUCH`
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).