Potprogrami i funkcije. "Stare" moderne karakteristike Perla

Ugrađene funkcije koriste se kao termini izraza i dijele se u dvije kategorije: operatori popisa i unarni operatori. To utječe na njihov prioritet u odnosu na "," - operator zarez. Operatori popisa mogu uzeti mnogo (popisa) argumenata, dok unarni operatori mogu uzeti samo jedan. Dakle, zarez završava argumente unarnog operatora i odvaja argumente operatora liste.

Argument unarnog operatora obično se shvaća kao skalarni kontekst i popis u oba skalara i

listama sa skalarnim argumentima koji dolaze prvi. U nastavku ćemo argumente popisa označavati riječju “LIST”, što znači da funkcija ima popis argumenata odvojenih zarezima.

Argumenti funkcije mogu se staviti u zagrade i na taj način pokazati da je "ovo funkcija" i da prioritet nije bitan, inače je to lista ili unarni operator s određenim fiksnim prvenstvom. Razmak iza naziva funkcije i zagrada nema nikakvog značenja. Stoga, budite oprezni!

Primjer:

ispis 1 + 2 + 3; # rezultat 6

ispis(1+2)+3; # rezultat 3

ispis (1+2)+3; # opet 3

ispis(1+2+3); #6

Ako funkcija vraća rezultat iu skalarnom iu popisnom kontekstu, tada je izlazni kod pogreške skalarni c nedefiniran ili prazan popis.

Upamtite pravilo:

Ne postoji opće pravilo za pretvaranje liste u skalar!

Svaki operator i funkcija ima svoju vrstu vrijednosti u skalarnom kontekstu.

Za neke je to broj elemenata iz skalarnog konteksta. Za ostale, prvi element popisa ili zadnji ili broj uspješnih operacija. Svatko za sebe osim ako to posebno ne odredite.


Operator "-X".

-X pokazivač datoteke

-X izraz

Provjera datoteke u kojoj je "X" jedna od dolje opisanih vrijednosti.

Ovo je unarni operator s jednim argumentom, ili imenom datoteke ili pokazivačem datoteke. Provjerava jedan od uvjeta. Ako argument nije naveden, uzima se vrijednost varijable $_. Za sklopku -t STDIN.

Rezultat 1 ako je istina i "" ako je laž ili nedefinirano ako datoteka nije pronađena. Unatoč čudnom izgledu, to je unarni operator s odgovarajućim prvenstvom. Argument se može staviti u zagrade.

"x" ima sljedeća značenja:

-r Datoteka je čitljiva prema efektivnom uid/gid

-w za snimanje -//-

-x izvršenje -//-

-o pripada efektivnom uid-u (korisnički ID)

-R Datoteka je čitljiva pomoću stvarnog uid/gid

-W za snimanje -//-

-X izvršenje -//-

-O pripada pravom uid

-e dokument postoji

-z prazan

-s nije prazno

-fčisti tekst

-d imenik

-str cijevi (transportne trake)

-S utičnica

-b poseban blok uređaj

-c-//– simbolično -//-

-t pokazivač na tty uređaj

-u setuid bit je postavljen

-g-//– setgid

-k-//- ljepljiv

-T tekstualna datoteka

-B binarni

-M“starost” datoteke u danima u trenutku pokretanja skripte

-A dana od posljednjeg čitanja

-C dana od zadnje izmjene inode-a


trbušni izraz

Apsolutna vrijednost izraza


prihvatiti NEWSOCKET, GENERICSOCKET

Otvorite novu utičnicu na temelju vanjskog zahtjeva. Isto kao i sistemski poziv prihvatiti(). Vraća adresu ili false u slučaju neuspjeha.


sekunde alarma

Pošaljite signal SIGALARM trenutnom procesu nakon isteka određenog vremenskog razdoblja. Nije dopušteno upućivati ​​više poziva istovremeno u jednom vremenskom razdoblju.

Vraća preostalo vrijeme prethodnog brojača.


atan2 Y, X

Arktangul omjera Y prema X u rasponu od -pi do +pi.


vezati utičnicu, naziv

Dodijeliti Internet adresa sokitu. Slično pozivu sustava vezati. Povratak pravi ako bude uspješno i lažno inače.

Ime - adresa paketa Sokita.


binmode datoteka

Otvorite datoteku za način binarnog pristupa.

U normalnom načinu rada, CR LF se prevodi u LF za ulaz, a LF se prevodi u CR LF za izlaz.


funkcija blagoslova

Ova funkcija utvrđuje da objekt naveden vezom pripada klasi. Ako klasa nije navedena, onda se odnosi na trenutnu klasu. Ovo je obično zadnja izjava u konstruktoru objekta.

Potrebno je navesti naziv klase ako definirani objekt može naslijediti klasa potomak.


funkcija pozivatelja

izraz pozivatelja

Vraća kontekst poziva trenutne potprograma.

U skalarnom kontekstu, istinito ako je potprogram ili procedura koju pozivaju operatori eval() ili require(), a lažno u suprotnom.

U okviru s popisom ovo je popis ($package, $filename, $line)

$paket– naziv paketa

$naziv datoteke– naziv datoteke paketa

$linija– broj linije odakle je poziv upućen.

Ako je naveden izraz, vraća se lista:

($paket, $naziv datoteke, $linija, $podrutina, $hasargs, $wantargs)

Izraz određuje dubinu ugniježđivanja pogleda snopa poziva.

$podrutina– naziv potprograma

$hasargs– dostupni argumenti

$wantargs– potrebni argumenti

Korištenje ove funkcije u DB paketu vraća detaljnije informacije. Popis @DB::args pridodaje se popisu argumenata.


chdir izraz

Idite u direktorij naveden izrazom. Ako izraz nedostaje, idite u "kućni" direktorij.

Vraća true u slučaju uspjeha i false u slučaju neuspjeha.


chmod popis

Promjena prava pristupa datotekama navedenim na popisu.

Prvi element na popisu je numerička, obično oktalna vrijednost dopuštenja.

Vraća broj datoteka čija su dopuštenja promijenjena.

chmod 0666 "f1", "f2", "f3";


chomp varijabla

chomp lista

Uklanja znak određen varijablom $/ s kraja retka.

Ovo je obično "LF". Vraća broj uklonjenih znakova. Ako varijabla nije navedena, tada se koristi varijabla $_.

Ako je popis naveden, tada se svaki redak popisa obrađuje i vraća se ukupan broj uklonjenih znakova.


chop varijabla

chop lista

Potpuno slično funkciji chomp, ali uvijek uklanja zadnji znak niza.


chown lista

Promijenite "vlasnika" i "grupu" datoteka popisa.

Prvi element je broj novog vlasnika, drugi broj nova grupa a zatim popis datoteka.

Na većini Unix sustava ne možete promijeniti vlasnika osim ako niste superkorisnik, ali možete promijeniti grupu ako je to jedna od vaših "sekundarnih" grupa.


chr broj

Vraća znak s navedenim kodom za kodiranje.


chroot direktorij

Učinite navedeni direktorij "root".

"Korijen" znači da se unutar programa može nazivati ​​" / ".


zatvori datoteku

Zatvorite otvorenu datoteku ili stream. Ne smije se koristiti

ako se ponovno otvori ista datoteka jer automatski će se zatvoriti s novim open() pozivom.


zatvoren direktorij

Zatvori imenik otvorena funkcija opendir().


spojna utičnica, naziv

Kontaktirajte udaljenu utičnicu. Ova je funkcija slična pozivu sustava Spojiti(). Vraća true ako je uspješno

a false kod pogreške.


cos izraz

Kosinus izraza je u radijanima.


tekst kripte, sol

Šifriranje teksta. Slično sustavu kripta().

dbmclose hash

Zatvara vezu između hasha i baze podataka.


dbmopen raspršivanje, baza, način

Povežite navedeni hash i bazu u određenom načinu rada.

Činjenica je da Pearl implementira vrlo prikladan mehanizam za rad s bazama podataka kao što su dbm, ndbm, sbdm, gdbm i Berkeley DB. Da biste to učinili, morate povezati (otvoriti) bazu pod hash imenom. Sav rad sa zapisima baze podataka izvodi se kao da se radi o običnom hash-u (asocijativnom nizu).

Za više detalja pogledajte opis funkcije. AnyDBM().


definirati izraz

Vraća true ako je vrijednost definirana (postoji) i false ako nije. Mnoge operacije završavaju s nedefiniranom vrijednošću, kao što je čitanje nakon kraja datoteke, korištenje nedefiniranih varijabli, sistemske pogreške itd.

Ova vam funkcija omogućuje razlikovanje nultih i nedefiniranih vrijednosti te jesu li funkcije ili reference definirane ili nedefinirane. Kada se koristi sigurnost ključa u raspršivanju, vraća se sigurno dati ključ ili ne nego postoji li on ili ne.


izbrisati izraz

Uklonite vrijednost iz raspršivanja. Vraća vrijednost koju treba ukloniti ili nedefiniranu ako ništa nije uklonjeno.

Uklanjanje okruženja iz polja $ENV() – mijenja okruženje.

Uklanjanje iz hasha povezanog s bazom podataka – briše unos u bazi podataka.


die lista

Ako program nije pokrenut iz eval() Ova funkcija šalje popis u STDERR tok i prekida program s kodom iz varijable $! Ako $! sadrži 0 zatim s kodom ($? >> 8). Ako je i ovo 0 onda s kodom 255.

Kada se pozove iz eval(), poruka o pogrešci pohranjuje se u varijabli $@ i eval() ne uspijeva s nedefiniranom vrijednošću. To vam omogućuje da riješite situacije pogreške bez isključivanja glavnog modula.

Ako redak iz popisa ne završava znakom "\n", tada se dodatno ispisuje broj retka skripte iz kojeg je funkcija pozvana i broj ulaznog retka, ako postoji.


učiniti BLOK

To zapravo i nije funkcija. Ovo vraća vrijednost zadnje izjave u bloku. Kada koristiti ciklički modifikator

BLOCK se izvršava prije provjere stanja petlje, za razliku od običnih petlji.


učiniti potprogram

Zastarjela metoda pozivanja potprograma.


izraziti se

Vrijednost izraza tumači se kao naziv datoteke Perl skripte.

Ovo se izvorno koristilo za uključivanje knjižničnih rutina.

Sada je ispravnije koristiti pozive use() i require(), koji omogućuju kontrolu pogreške i prekida.


oznaka odlagališta

Izvođenje dumpa trenutne memorije. Korišten je za mogućnost korištenja programa undump za uključivanje trenutnog izvršnog koda u program nakon inicijalizacije svih varijabli.

Izvršenje ovog novog programa započet će naredbom goto. Ako je oznaka izostavljena, počnite ispočetka.

Pažnja! Datoteke otvorene prije dumpa neće biti otvorene

u trenutku izvođenja novog programa.


svaki hash

Vraća niz od 2 elementa. Prvi element je ključ, drugi je vrijednost sljedećeg hash elementa. Omogućuje vam "pregledavanje" svih hash vrijednosti određenim redoslijedom. Varijabla petlje se resetira tek nakon što se prijeđe cijeli niz.


eof()

Vraća 1 ako se čita nakon završetka ili čita od ne otvorena datoteka. Argument mora biti izraz koji vraća pokazivač postojeće datoteke. Ova funkcija ne može se koristiti za čitanje datoteka otvorenih kao terminali.

Ako argument nije naveden, koristi se zadnja pročitana datoteka.

Korištenje eof() u obrascu je korisno u dok petlje(<>) odrediti samo kraj posljednja datoteka iz

popis. Koristite eof(ARGV) ili eof da odredite kraj svake datoteke na popisu.


vrijedan izraz

vrijedan izraz

Izraz se skenira i izvršava kao normalan Pearl program.

Ovo se radi u kontekstu trenutnog programa tako da možete koristiti već definirane varijable i potprograme.

Vraća rezultat zadnje naredbe u bloku ili vrijednost naredbe povratak . Ako se nađe sintaktička pogreška ili će izjava biti izvršena umrijeti vraća se nedefinirana vrijednost i varijabla $@ sadrži poruku o pogrešci. Ako nije bilo pogreške, tada $@ sadrži nulti niz. Ako nema argumenta, uzima se vrijednost varijable $_.


popis izvršitelja

Izvedena naredba sustava s popisa i izvršavanje programa završava. Ako se trebate vratiti, bolje je koristiti funkciju sustav(). Ako popis ima više od 1 argumenta ili je popis niz s više od 1 elementa, tada izvršite sistemski poziv execvp() s argumentima s popisa.

Ako postoji jedan skalarni argument, tada se skenira za obradu metakaraktera i ako su prisutni, tada se rezultirajući argumenti prosljeđuju tumaču /bin/sh-c za daljnju obradu.

Ako nema metakaraktera, argument se dijeli na riječi i prosljeđuje sistemskom pozivu execvp() koji je učinkovitiji.

Pažnja! exec() I sustav(0) nemojte resetirati I/O međuspremnik tako da morate postaviti varijablu $| kako bi se spriječio gubitak izlaznih informacija.


postoji izraz

Vraća true ako postoji navedeni ključ hash čak i ako njegova vrijednost nije definirana.


izlazni izraz

Izvršenje programa završava kodom izraza.


exp izraz

Vraća e (bazu prirodnog logaritma) na potenciju izraza.


fcntl datoteka, funkcija, skalar

Izvršava sistemski poziv fcntl(). Da biste ga koristili, svakako pokrenite use Fcntl;


fileno file

Vraća oznaku datoteke za dati pokazivač datoteke.


datoteka jata, operacija

sistemski poziv flock().


vilica

sistemski poziv fork(). Vraća pid djeteta za roditelja i 0 za dijete ako je uspješno, inače nedefiniranu vrijednost.


format

Perl deklarativna funkcija. Određuje izlazni format za izjavu pisati. Za detalje pogledajte poglavlje Formati.


formline format, lista

Interna funkcija korištena u formatu. Formatira izlaz parametara s popisa. Rezultat se nalazi u varijabli $^A, funkcija pisanja jednostavno ispisuje vrijednost ove varijable, ali se također može pročitati i zatim resetirati. Format obično čini jedan poziv formline-u po retku obrasca, ali formline ne razdvaja retke formata. To znači da znakovi "~" i "~~" tretiraju cijeli format kao jednu liniju, tako da je potrebno koristiti višelinijske formide za opisivanje jednog unosa formata.


getc datoteka

getc datoteka

Čita i vraća znak iz navedene datoteke.

Ako datoteka nije navedena tada se čita STDIN. Vraća prazan niz nakon kraja datoteke.


getlogin

Vraća trenutnu prijavu iz /etc/utmp datoteke

Nemojte ga koristiti za identifikaciju korisnika; nije "zatvoren" kao getpwuid().


getpeername utičnica

Vraća upakiranu adresu udaljene utičnice.


getpgrp PID

Vraća grupu procesa s navedenim PID-om. Ako argument nedostaje, vraća grupu trenutnog procesa.


dobitippid

Vraća PID nadređenog procesa.


getpriority KOJI, TKO

Vraća trenutni prioritet procesa, grupe procesa ili korisnika.

Nastavimo učiti Perl. U ovom poglavlju pažnju usmjeravamo na funkcije. Funkcije su blokovi koda kojima se daju imena kako bismo ih mogli koristiti kada su nam potrebni. Funkcije vam pomažu organizirati kod u lako razumljive dijelove. Omogućuju vam da napravite program korak po korak, testirajući ga usput.

Nakon što imate ideju za program, morate razviti dijagram njegove konstrukcije - u svojoj glavi ili na papiru. Svaki korak u dijagramu može predstavljati jednu funkciju u vašem programu. To se zove modularno programiranje. Modularno programiranje vrlo je dobro jer vam omogućuje skrivanje detalja programa, čime se poboljšava čitljivost izvornog koda vašeg programa.

Na primjer, ako vaš program sadrži funkciju koja izračunava površinu kruga, možete je pozvati pomoću sljedećeg retka:

$areaOfFirstCircle = areaOfCircle($firstRadius);

Gledajući ovakve pozive funkcija, osoba koja čita izvor vaš program, razumije što vaš program radi. Istodobno, on ne mora znati kako se točno provodi ova ili ona funkcija. Stoga je važno funkcijama dati "govorna" imena - tako da iz imena možete razumjeti što točno funkcija radi.

Poziv funkcije znači da Perl interpreter na mjestu gdje je funkcija pozvana prestaje izvršavati trenutni niz redaka koda i prelazi na izvršavanje koda funkcije. Kada se kod funkcije završi, interpreter se vraća na pozivnu točku i nastavlja izvršavanje programa od sljedećeg retka.

Pogledajmo pobliže poziv funkcije - prvo vidimo skalarnu varijablu, zatim operator dodjele. Već znate što to znači - Perl će varijabli $areaOfFirstCircle dodijeliti vrijednost s desne strane znaka dodjele. Ali što je zapravo na desnoj strani?

Prvo što vidite je naziv funkcije areaOfCircle(). Desne zagrade i odsutnost simbola $, @ i % ispred imena pokazuju da se radi o pozivu funkcije. Unutar zagrada nalazi se popis parametara ili vrijednosti proslijeđenih funkciji.

Izračunavanje površine kruga:

$područjePrvogKruga = područjeKruga(5);
print("$areaOfFirstCircle\n");
podpodručjeKruga(
$radijus = $_;
return(3,1415 * ($radijus ** 2));
}

Program će ispisati:

Deklaracija funkcije:

naziv podfunkcije (
funkcija tijela
}

To je sve. Vaša funkcija je spremna.

Situacija je kompliciranija s parametrima. Parametri su vrijednosti koje prosljeđujemo funkciji. Parametri se nalaze unutar zagrada odmah iza naziva funkcije. U gornjem primjeru, poziv funkcije je areaOfCircle(5). Ovdje smo koristili samo jedan parametar. Ali čak i ako funkcija ima samo jedan parametar, Perl, kada se funkcija pozove, stvara niz parametara koje funkcija koristi.

Unutar funkcije, niz parametara se zove @_. Svi parametri proslijeđeni funkciji sadržani su u polju @_, odakle se mogu dohvatiti ako je potrebno.

Naša mala funkcija iz gornjeg primjera mogla bi to učiniti pomoću sljedećeg retka:

$radijus = $_;

Ovaj redak dodjeljuje prvi element niza @_ skalarnoj varijabli $radius.

Ako želite, možete izostaviti naredbu return za vraćanje vrijednosti; Perl će automatski vratiti vrijednost zadnjeg procijenjenog izraza. Ali bit će bolje ako i dalje koristite naredbu return - na taj ćete način izbjeći mnoge slučajne pogreške.

Možda ste vidjeli razliku između potprograma i funkcija u nekim programskim jezicima. U takvim jezicima funkcija nužno vraća vrijednost, dok u isto vrijeme potprogram ne vraća vrijednost. U Perlu to ne postoji - imate samo funkciju - bez obzira vraća li neku vrijednost ili ne.

Upotreba niza parametara (@_)

Kao što je ranije spomenuto, funkcija može pronaći sve parametre u nizu parametara @_. Ovo je vrlo zgodno - da biste saznali koliko je parametara proslijeđeno funkciji, samo trebate pristupiti nizu parametara @_ u skalarnom kontekstu.

prvi pod(1, 2, 3, 4, 5, 6);
prvi pod(1..3);
prvi pod("A".."Z");
sub firstSub(
$numParameters = @_ ;
print("Broj parametara je $numParameters\n");
}

Program će ispisati:

Broj parametara je 6

Broj parametara je 3

Broj parametara je 26

Perl vam omogućuje prosljeđivanje bilo kojeg broja parametara funkciji. Sama funkcija može odrediti koje parametre koristiti i kojim redoslijedom. Niz parametara @_ može se koristiti kao bilo koji drugi niz.

Naravno, nije baš zgodno pristupiti parametrima proslijeđenim funkciji njihovim brojevima - @_ ili @_. Možete koristiti prikladniju tehnologiju:

površinapravokutnika(2, 3);
površinapravokutnika(5, 6);
podpodručjepravokutnika(
($visina, $širina) = @_ ;
$površina = $visina * $širina;
print("Visina je $height. Širina je $width. Površina je $area.\n\n");
}

Program će ispisati:

Visina je 2. Širina je 3. Površina je 6.

Visina je 5. Širina je 6. Površina je 30.

Ako funkciji proslijedite varijablu umjesto broja, tada ako se njezina vrijednost promijeni unutar funkcije, promijenit će se i za ostatak programa. To se zove prosljeđivanje parametara po referenci.

@niz = (0..5);

prvi pod(@niz);

sub firstSub(
$_ = "A";
$_ = "B";
}

Program će ispisati:

Nakon poziva funkcije, niz = A B 2 3 4 5

Kao što vidite, funkcija je promijenila vrijednost parametara koji su joj proslijeđeni, a to je također utjecalo na ostatak programa - vrijednosti niza @array promijenile su se ne samo za funkciju, već i za ostatak programa . Ovo je loša programska praksa - ako nemate tako specifičan cilj, nikada nemojte koristiti takve bonuse - prepuni su neočitih pogrešaka. S druge strane, ako na početku funkcije dodijelite vrijednosti proslijeđenih parametara novim varijablama (kao što je ranije prikazano), a kasnije radite samo s njima, nećete imati takav problem - jer u ovom slučaju zapravo ne mijenjate vrijednosti koje su proslijeđene parametrima funkcije.

Evo primjera istog programa, ali ispravnije napisanog:

@niz = (0..5);
print("Prije poziva funkcije, niz = @niz\n");
prvi pod(@niz);
print("Nakon poziva funkcije, niz = @niz\n");
sub firstSub(

$prvaVar = "A";
$secondVar = "B";
}

Program će ispisati:

Prije poziva funkcije, niz = 0 1 2 3 4 5

Nakon poziva funkcije, niz = 0 1 2 3 4 5

Kao što vidite, funkcija dodjeljuje vrijednosti parametara koji su joj proslijeđeni novim varijablama, a zatim radi samo s njima - bez izravne promjene niza parametara.

Ali tada možete naići na drugi problem:

$prvaVar = 10;
@niz = (0..5);
print("Prije poziva funkcije\n");

print("\tarray = @array\n");
prvi pod(@niz);
print("Nakon poziva funkcije\n");
print("\tfirstVar = $firstVar\n");
print("\tarray = @array\n");
sub firstSub(
($firstVar, $secondVar) = @_ ;
$prvaVar = "A";
$secondVar = "B";
}

Program će ispisati:

Prije poziva funkcije
firstVar = 10
niz = 0 1 2 3 4 5

Nakon poziva funkcije
prvaVar = A
niz = 0 1 2 3 4 5

To jest, prema zadanim postavkama, sve varijable u Perl programu dostupne su iz bilo kojeg dijela koda. To je vrlo zgodno u mnogim slučajevima, ali često uzrokuje neugodnosti i dovodi do neugodnih pogrešaka. Zatim ćete naučiti kako stvoriti varijable koje su vidljive samo unutar svojih funkcija.

Opseg varijabli.

Opseg varijable su oni dijelovi koda u kojima možete koristiti danu varijablu. Prema zadanim postavkama, svaka varijabla u Perl programu je "vidljiva" s bilo kojeg mjesta u programu.

Ponekad je vrlo korisno ograničiti opseg određene varijable unutar funkcije. U tom slučaju promjena vrijednosti varijable unutar funkcije neće ni na koji način utjecati na ostatak programa. Perl ima dvije funkcije - my() i local(). Prvi stvara varijablu koja je vidljiva samo unutar zadane funkcije. Drugi stvara varijablu koju također mogu "vidjeti" funkcije pozvane iz te funkcije.

firstSub("AAAAA", "BBBBB");
sub firstSub(
lokalno($prvaVar) = $_;
my($secondVar) = $_;


secondSub();
print("firstSub: firstVar = $firstVar\n");
print("firstSub: secondVar = $secondVar\n\n");
}

Sub secondSub(


$prvaVar = "ccccC";
$secondVar = "DDDDD";
print("secondSub: firstVar = $firstVar\n");
print("secondSub: secondVar = $secondVar\n\n");
}

Program će ispisati:

firstSub: firstVar = AAAAA
firstSub: secondVar = BBBBB
secondSub: firstVar = AAAAA
Upotreba neinicijalizirane vrijednosti u retku 19 test.pl.
secondSub: secondVar =
secondSub: firstVar = ccccC
secondSub: secondVar = DDDDD
firstSub: firstVar = ccccC
firstSub: secondVar = BBBBB

Kao što vidite, funkcija secondSub() nema pristup varijabli $secondVar koju je stvorila funkcija my() unutar funkcije firstSub(). Perl čak prikazuje poruku koja vas upozorava na to. U isto vrijeme, varijabla $firstVar je dostupna i može se promijeniti funkcijom secondSub().

Ako je moguće, pokušajte koristiti samo funkciju my(), a ne funkciju local() - to će vam dati veću kontrolu nad opsegom vaših varijabli.

Zapravo, funkcija my() mnogo je složenija i funkcionalnija. Ali o tome će biti riječi u 15. poglavlju - "Moduli Perla".

Sjećate li se razlike između prosljeđivanja parametara funkcije prema referenci i prema vrijednosti? Ako proslijedite parametre po vrijednosti, tada funkcija ne može promijeniti vrijednosti parametara (varijabli) koje su joj proslijeđene, što znači da to ni na koji način neće utjecati na cijeli program. Ako proslijedite parametre referencom, tada funkcija može promijeniti vrijednosti parametara (varijabli), a to će se odraziti u glavnom programu. Dakle, kada koristite funkciju local(), metoda prosljeđivanja parametara prema referenci funkcionira malo drugačije - funkcije mogu mijenjati vrijednosti parametara (varijabli) koje su im proslijeđene, ali to će utjecati samo na "gornju" funkciju - onaj gdje je korištena lokalna (funkcija), - to ni na koji način neće utjecati na glavni program.

Korištenje liste kao parametra funkcije.

Sada kada smo razumjeli opseg varijabli, pogledajmo parametre funkcije iz druge perspektive. Kao što smo već rekli, svi parametri funkcije prosljeđuju se u jednom polju, ali što ako funkciji trebate proslijediti jedan parametar - skalar, a drugi parametar - polje? Sljedeći primjer pokazuje što će se dogoditi:

prvi pod((0..10), "AAAA");
sub firstSub(
lokalno(@niz, $prvaVar) = @_ ;

print("firstSub: firstVar = $firstVar\n");
}

Program će ispisati:

firstSub: niz = 0 1 2 3 4 5 6 7 8 9 10 AAAA
Upotreba neinicijalizirane vrijednosti u retku 8 test.pl.
firstSub: firstVar =

Možete vidjeti da prilikom inicijalizacije varijabli @array apsorbira sve elemente niza parametara @_, ne ostavljajući ništa iza skalarne varijable $firstVar. To potvrđuje i poruka upozorenja Perl interpretera. Ovaj problem možete riješiti zamjenom parametara - ako prvo stavite skalarnu varijablu pa onda niz, onda će sve biti kako treba:

firstSub("AAAA", (0..10));
sub firstSub(
lokalno($firstVar, @array) = @_ ;
print("firstSub: array = @array\n");
print("firstSub: firstVar = $firstVar\n");
}

Program će ispisati:

firstSub: niz = 0 1 2 3 4 5 6 7 8 9 10
firstSub: firstVar = AAAA

Funkciji možete proslijediti koliko god želite skalarnih vrijednosti, ali samo jedan niz. Ako pokušate proslijediti višestruke nizove u funkciju, njihovi elementi će se jednostavno spojiti u jedan niz, a funkcija neće moći znati gdje jedan niz završava, a drugi počinje.

Ugniježđene (rekurzivne) funkcije.

Funkcije mogu pozivati ​​same sebe, idući dublje od nekoliko razina. Koliko ovisi o specifičnoj Perl implementaciji, specifičnom hardveru i konfiguraciji. Obično će resursi vašeg stroja biti dovoljni i ne morate brinuti o tome. Ali ako ste zainteresirani, možete pokušati pokrenuti ovaj program:

FirstSub();
sub firstSub(
print("$count\n");
$count++;
prvi pod();
}

Program će ispisati:

Pogreška: iznimka vremena izvođenja

Prije ispisa ove poruke o pogrešci, program će povećavati vrijednost varijable $count koliko god može rekurzivni poziv funkcije. Dakle, prema vrijednosti varijable $count, možete reći koliko razina rekurzivnih poziva vaš sustav dopušta.

Ali nemojte se zanositi rekurzijom - vrijedi je pažljivo proučiti u posebnim slučajevima, na primjer, u nekim matematičkim izračunima.

Privatne funkcije.

Možda ćete morati upotrijebiti funkciju ograničenog opsega. Već smo shvatili kako to učiniti s varijablama. Evo kako to funkcionira s funkcijama:

$temp = izvestiCalc(10, 10);
print("temp = $temp\n");
sub performCalc(
moj ($firstVar, $secondVar) = @_;
moj $square = sub (
povratak($_**2);
};
return(&$square($firstVar) + &$square($secondVar));
};

Program će ispisati:

Kao što vidite, imamo funkciju $square. Točnije, $square je regularna skalarna varijabla koja se odnosi na funkciju. Za upućivanje na funkciju koristimo znak & ispred naziva varijable $square. Ovu funkciju možemo koristiti samo unutar funkcije performCalc() - nije dostupna ostatku programa.

: atan2 broj 1, broj2 Argumenti: broj 1, broj2 numerički izrazi Proizlaziti: numerička vrijednost

Funkcija atan2 vraća arktangens kvocijenta dijeljenja brojevi1 na broj2. Rezultat je u rasponu od -π do +π i odgovara kutu u radijanima između x-osi i vektora do točke s koordinatama ( broj2, broj 1). Primjeri:

$x = atan2 -0, -1; # x je -3,14159265358979 $x = atan2 -1, 0; # x jednako -1,5707963267949 $x = atan2 0, 1; # x jednako 0 $x = atan2 1, 1; # x jednako 0,785398163397448 $x = atan2 1, 0; # x je jednako 1,5707963267949 $x = atan2 0, -1; # x jednako 3,14159265358979

cos funkcija

Sintaksa :cos broj Argumenti: broj brojčani izraz Proizlaziti: brojčana vrijednost

Funkcija cos vraća kosinus brojevima. Ako je argument izostavljen, onda broj

$pi = atan2 0, -1; $x = cos 0; # x jednako 1 $x = cos $pi/2; # x je 6e-17 (skoro 0) $x = cos $pi; # x jednako -1

exp funkcija

Sintaksa : eksp broj Argumenti: broj brojčani izraz Proizlaziti: brojčana vrijednost

Funkcija eksp vraća eksponent brojevima. Ako je argument izostavljen, onda broj uzima se jednaka vrijednosti varijable $_. Ako broj veći od 709,78, tada se vraća 1.#INF. Primjer:

Ispis exp 1; #2.71828182845905

int funkcija

Sintaksa : int broj Argumenti: broj brojčani izraz Proizlaziti: brojčana vrijednost

Funkcija int vraća cijeli dio brojevima. Ako je argument izostavljen, onda broj

Ispis int 1.5; #1 print int -1.5; # -1

funkcija dnevnika

Sintaksa :log broj Argumenti: broj brojčani izraz Proizlaziti: brojčana vrijednost

Funkcija log vraća prirodni logaritam brojevima. Ako je argument izostavljen, onda broj

Ispis dnevnika 2.71828182845905; # 1

rand funkcija

Sintaksa : rand broj Argumenti: broj brojčani izraz Proizlaziti: brojčana vrijednost

Funkcija rand vraća nasumični broj veći od ili jednaka nuli i manje brojevima, koji mora biti pozitivan. Ako je argument izostavljen, onda broj pretpostavlja se da je jednak 1. Ako funkcija još nije pozvana, automatski ju poziva.

funkcija grijeha

Sintaksa : grijeh broj Argumenti: broj brojčani izraz Proizlaziti: brojčana vrijednost

Funkcija grijeh vraća sinus brojevima. Ako je argument izostavljen, onda broj uzima se jednaka vrijednosti varijable $_. Primjeri:

$pi = atan2 0, -1; $x = sin 0; # x jednako 0 $x = sin $pi/2; # x jednako 1 $x = sin -$pi/2; # x jednako -1

sqrt funkcija

Sintaksa :sqrt broj Argumenti: broj brojčani izraz Proizlaziti: brojčana vrijednost

Funkcija sqrt vraća kvadratni korijen od brojevima. Ako je argument izostavljen, onda broj uzima se jednaka vrijednosti varijable $_. Ako je argument manji ili jednak nuli, javlja se fatalna pogreška vremena izvođenja. Primjer:

Ispis sqrt 2; #1.4142135623731

funkcija srand

Sintaksa : srand broj Argumenti: broj brojčani izraz

Funkcija srand inicijalizira generator slučajni brojevi. Ako je njegov argument izostavljen, onda broj generiran od strane runtime sustava. Od PERL 5.004, eksplicitni poziv ove funkcije više nije potreban jer je sada automatski poziva rand() prvi put kada se pozove.

6.9.2. String funkcije

funkcija žvakanja

Sintaksa :chomp crtažvakati popis Argumenti: crta string izraz popis Proizlaziti: brojčana vrijednost

Funkcija žvakati briše iz linije završni podniz koji odgovara separatoru trenutnog zapisa, tj. sadržaju varijable $/. Ako je argument popis, tada se ova funkcija primjenjuje na svaki element popisa. Ako je argument izostavljen, onda crta uzima se jednaka vrijednosti varijable $_. Rezultat funkcije je ukupan broj uklonjenih znakova.

Njegova glavna upotreba je uklanjanje izlaznih znakova za novi red kada se čita red po red. tekstualna datoteka, Na primjer:

Dok(<>) (chomp; # ukloniti \n na kraju retka za čitanje $_ . . . )

Ako je $\jednako undef ili sadrži referencu na broj (za zapise fiksne duljine), tada ova funkcija ne briše ništa.

funkcija sjeckanja

Sintaksa : usitniti crta usitniti popis Argumenti: crta string izraz popis popis string izraza Proizlaziti: vrijednost niza

Funkcija usitniti briše iz linije njegov posljednji znak i vraća ga. Ako je argument popis, tada se ova funkcija primjenjuje na svaki element popisa i vraća zadnji uklonjeni znak. Ako je argument izostavljen, onda crta

$_ = "abcde"; usitniti; tiskati; # ispisuje "abcd"

funkcija kripte

Sintaksa :kripta crta, kodirati Argumenti: crta, kodirati string izrazi Proizlaziti: vrijednost niza

Funkcija kripta kodira izvornik crta pomoću niza kodirati i vraća rezultat. Kodirati mora se sastojati od dva znaka u rasponu [./0-9A-Za-z] . Ne postoji uparena funkcija dekodiranja u PERL-u, tako da ova funkcija nema praktične koristi.

funkcija indeksa

Sintaksa : indeks crta, podniz, položaj? Argumenti: crta, podniz string izrazi položaj brojčani izraz Proizlaziti: brojčana vrijednost

Funkcija indeks gledajući unutra crta dano podniz, polazeći od zadanog pozicije ili s početka retka ako položaj

$str = "Kraljica Marija"; ispis indeksa ($str, "Marija"); # 6 ispis indeksa ($str, "marija"); # -1

lc funkcija

Sintaksa : lc crta Argumenti: crta string izraz Proizlaziti: vrijednost niza

Funkcija lc pretvara sve znakove linije malim slovima. Ako je argument izostavljen, onda crta

Ispis lc "ABCDE"; #a B C D E

lcprva funkcija

Sintaksa : lcprvi crta Argumenti: crta string izraz Proizlaziti: vrijednost niza

Funkcija lcprvo pretvara prvi znak linije V malo slovo. Ako je argument izostavljen, onda crta uzima se jednaka vrijednosti varijable $_. Ako se koristi direktiva use locale, pretvorba se provodi uzimajući u obzir trenutnu postavku locale. Primjer:

Ispis lcprvo "ABCDE"; # a B C D E

funkcija duljine

Sintaksa : duljina crta Argumenti: crta string izraz Proizlaziti: brojčana vrijednost

Funkcija duljina vraća broj znakova u crta. Ako je argument izostavljen, onda crta uzima se jednaka vrijednosti varijable $_. Primjer:

Dužina ispisa "ABCDE"; # 5

rindex funkcija

Sintaksa : indeks crta, podniz, položaj? Argumenti: crta, podniz string izrazi položaj brojčani izraz Proizlaziti: brojčana vrijednost

Funkcija indeks gledajući unutra crta dano podniz s desna na lijevo, počevši od zadanog pozicije ili s kraja retka ako položaj izostavljeno. Vraća položaj pronađenog podniza u izvornom nizu ili -1 ako podniz nije pronađen. Primjer:

Ispis rindex("abcabc", "abc"); #3

funkcija substr

Sintaksa :substr crta, pristranost, duljina?, zamjena? Argumenti: crta, zamjena string izrazi pristranost, duljina numerički izrazi Proizlaziti: vrijednost niza

Funkcija substr vraća podniz linije dano duljina, polazeći od zadanog kompenzacije. Ako pristranost je negativan, tada se broji od kraja retka. Ako duljina je izostavljen, tada se izdvajaju znakovi do kraja retka; ako je negativan, tada se dodaje duljini niza. Primjer:

Ispis substr("abcdef", 1, -2); #bcd

Ako crta s obzirom na varijablu, tada ova funkcija može imati četvrti argument, koji specificira niz u koji je dani podniz zamijenjen, na primjer:

$str = "abcdef"; substr($str, 1, -2,"xxx"); ispis $str; # axxxef

Ovaj primjer se može napisati ovako:

$str = "abcdef"; substr($str, 1, -2) = "xxx"; ispis $str; # axxxef

uc funkcija

Sintaksa :uc crta Argumenti: crta string izraz Proizlaziti: vrijednost niza

Funkcija uc pretvara sve znakove linije velikim slovima. Ako je argument izostavljen, onda crta uzima se jednaka vrijednosti varijable $_. Ako se koristi direktiva use locale, pretvorba se provodi uzimajući u obzir trenutnu postavku locale. Primjer:

Ispis uc "abcde"; #A B C D E

ucprva funkcija

Sintaksa : ucprvi crta Argumenti: crta string izraz Proizlaziti: vrijednost niza

Funkcija ucprvo pretvara prvi znak linije velikim slovom. Ako je argument izostavljen, onda crta uzima se jednaka vrijednosti varijable $_. Ako se koristi direktiva use locale, pretvorba se provodi uzimajući u obzir trenutnu postavku locale. Primjer:

Ispis ucfirst "abcde"; # A B C D E

6.9.3. Ostale skalarne funkcije

funkcija chr

Sintaksa :chr kodirati Argumenti: kodirati brojčani izraz Proizlaziti: vrijednost niza

Funkcija hr vraća znak koji ima zadani broj kodirati. Ako je argument izostavljen, onda kodirati uzima se jednaka vrijednosti varijable $_. Primjer:

Tisak chr 65; // A

hex funkcija

Sintaksa : šesterokutni crta Argumenti: crta string izraz Proizlaziti: brojčana vrijednost

Funkcija hex transformira crta V heksadecimalni broj. Ako je argument izostavljen, onda crta uzima se jednaka vrijednosti varijable $_. Na primjer, sve sljedeće izjave prikazat će broj 165:

Ispis hex "0xaf"; ispis hex "xaf"; ispis hex "0af"; ispis hex "af";

funkcija oct

Sintaksa :listopad crta Argumenti: crta string izraz Proizlaziti: brojčana vrijednost

Funkcija listopad transformira crta u broju. Ako crta počinje s "0x", tada se tumači kao heksadecimalni broj; ako počinje s "0b", tumači se kao binarni broj; u drugim slučajevima se tumači kao oktalni broj. Ako je argument izostavljen, onda crta uzima se jednaka vrijednosti varijable $_. Primjeri:

Ispis oct "0xaf"; #165 print oct "0b101"; #5 print list "0100"; #64 print oct "100"; #64

funkcija red

Sintaksa : red crta Argumenti: crta string izraz Proizlaziti: brojčana vrijednost

Funkcija red vraća brojčani kod prvog znaka linije. Ako je argument izostavljen, onda crta uzima se jednaka vrijednosti varijable $_. Primjer:

Ispis ili "ABC"; #65

funkcija paketa

Sintaksa : paket uzorak, popis Argumenti: uzorak string izraz popis popis skalarnih izraza Proizlaziti: vrijednost niza

Funkcija paket pakuje dato popis vrijednosti u niz i vraća ga kao rezultat. Pravila pakiranja određena su linijom uzorak, koji se sastoji od znakova koji označavaju pravila transformacije za elemente liste. Uzorak može sadržavati sljedeće znakove:

Simbol Proizlaziti
a Proizvoljni niz, dodajte nulti bajt na kraju.
A ASCII niz, dodajte razmak na kraju.
Z ASCII niz, dodajte nulti bajt na kraju.
b Niz bitova, bitovi u bajtu su pakirani počevši od najmanjeg bita.
B Niz bitova, bitovi u bajtu su pakirani počevši od bita najveće važnosti.
h Heksadecimalni niz, niska tetrada je prva.
H Heksadecimalni niz, visoka tetrada je prva.
c Jednobajtni cijeli broj s predznakom.
C Jednobajtni cijeli broj bez predznaka.
s Dvobajtni cijeli broj s predznakom.
S Dvobajtni cijeli broj bez predznaka.
ja Cijeli broj s predznakom (broj bajtova ovisi o arhitekturi).
ja Cijeli broj bez predznaka (broj bajtova ovisi o arhitekturi).
l Četverobajtni cijeli broj s predznakom.
L Četverobajtni cijeli broj bez predznaka.
n Dvobajtni cijeli broj bez predznaka, najvažniji bajt je prvi.
N Četverobajtni cijeli broj bez predznaka, najvažniji bajt prvi.
v Dvobajtni cijeli broj bez predznaka, prvi niži bajt.
V Četverobajtni cijeli broj bez predznaka, prvi niži bajt.
q Osmobajtni cijeli broj s predznakom.
Q Osmobajtni cijeli broj bez predznaka.
f Plutajući broj normalne preciznosti, format ovisan o arhitekturi.
d Plutajući broj dvostruke preciznosti, format ovisan o arhitekturi.
str Pokazivač na niz koji završava nulom.
P Pokazivač na strukturu fiksne duljine.
u Niz u uuencode kodiranju.
U Niz u UTF-8 kodiranju.
w Komprimirani cijeli broj u BER formatu.
x Nulti bajt.
x Duplicirani bajt.
@ Umetnite nule do navedene pozicije.

Predlošci se pokoravaju slijedeći pravila:

  • Nakon slova može slijediti broj koji određuje brojač ponavljanja. Za sve tipove osim a, A, Z, b, B, h, H, P ekstrahira se odgovarajući broj elemenata popis. Ako je brojač određen simbolom *, to znači pakiranje svih preostalih elemenata liste (osim za @, x, X, gdje je ovaj simbol ekvivalentan 0, i u, gdje je ekvivalentan 1). Z* znači dodavanje dodatnog nultog bajta na kraj niza. Broj ponavljanja za u tumači se kao najveći broj bajtova koji bi trebao biti kodiran u jednom retku izlaza; u ovom slučaju, 0 i 1 se zamjenjuju sa 45.
  • Tipovi a, A, Z uvijek dohvaćaju jednu vrijednost s popisa. Broj ponavljanja za njih znači duljinu pakiranog niza. Ako je linija duža od brojača, ona se skraćuje; ukratko, dopunjen je nulama (a, Z) ili razmacima (A). Kada su upakirani, a i Z su ekvivalentni; Prilikom raspakiranja, A uklanja razmake na kraju i nulte bajtove iz niza, Z uklanja sve nakon prvog nulti bajta i ne uklanja ništa.
  • Tipovi b i B pretvaraju svaki od ulaznih bajtova u jedan bit rezultata. Rezultirajući bit je 0 ili 1 ovisno o vrijednosti najmanjeg bita izvornog bajta. Brojač ponavljanja određuje broj bajtova koji se pakiraju. U ovom slučaju, b pakira primljene bitove u bajt rezultata, počevši od svog najmanje značajnog bita, a B od svog najvažnijeg bita. Ako duljina izvornog niza nije djeljiva s 8, tada se rezultat dopunjava s nula bitova. Tijekom dekompresije ti se dodatni bitovi zanemaruju. Ako je ulazni niz duži od brojača, on se skraćuje. * kao broj ponavljanja znači korištenje svih bajtova polja za unos. Kada se dekomprimiraju, bitovi se pretvaraju u bajtove "0" i "1".
  • Za tipove h i H, broj ponavljanja znači broj heksadecimalnih znamenki (tetrada) koje treba pakirati. Svaki od ulaznih bajtova pretvara se u jednu tetradu rezultata. U ovom slučaju, bajtovi “0””9”, “a””f”, “A””F” zamjenjuju se odgovarajućim heksadecimalnim znamenkama, a preostali bajtovi svojom najmanje značajnom tetradom. Tip h pakira rezultirajuće tetrade u bajt rezultata, počevši od najniže tetrade, a H od najviše. Ako je duljina izvornog niza neparna, tada se rezultat dopunjava nultom tetradom. Prilikom raspakiranja dodatna bilježnica se zanemaruje. Ako je ulazni niz duži od brojača, on se skraćuje. * kao broj ponavljanja znači korištenje svih bajtova polja za unos. Kada se raspakiraju, tetradi se pretvaraju u niz heksadecimalnih znamenki.
  • Tip p pakira pokazivač na niz koji završava nultom, a P pakira pokazivač na strukturu fiksne duljine koju određuje broj ponavljanja. Ako je vrijednost odgovarajućeg pokazivača undef, tada je pakirana nula.
  • Simbol / umjesto brojača ponavljanja omogućuje vam upakiranje njegove duljine ispred niza. Na primjer, uzorak "n/a*" znači da će se rezultat sastojati od dvobajtnog broja koji sadrži duljinu izvornog niza i samog niza.
  • Prilikom pakiranja ne provodi se izjednačavanje dobivenih vrijednosti.
  • Uzorak može sadržavati komentar koji počinje znakom # i nastavlja se do kraja retka.
  • Ako predložak zahtijeva više argumenata nego što sadrži popis, To popis je popunjen praznim redovima "" . Ako predložak zahtijeva manje argumenata nego što sadrži popis, tada se dodatni argumenti zanemaruju.

$foo = paket("CCCC",65,66,67,68); # $foo = "ABCD" $foo = pack("C4",65,66,67,68); # $foo = "ABCD" $foo = pack("aaaa","abc","x","y","z"); # $foo = "axyz" $foo = pack("a14","abcdefg"); # "abcdefg\0\0\0\0\0\0\0" $foo = paket("s2",1,2); # $foo = "\1\0\2\0" na IBM PC-u, "\0\1\0\2" na Macu

funkcija raspakiranja

Sintaksa : raspakirati uzorak, crta Argumenti: uzorak, crta string izrazi Proizlaziti: niz vrijednosti

Funkcija paket raspakira crta, prepun funkcije. Vraća niz dobivenih vrijednosti (u skalarnom kontekstu, vraća prvu vraćenu vrijednost). Pravila raspakiranja navedena su linijom uzorak, čija je struktura ista kao za . Dodatno, predložak može sadržavati prefiks % prije slova koje navodi vrstu raspakiravanja n, što ukazuje da ne želimo dobiti rezultat raspakiranja, već njegov n-bitni kontrolni zbroj. Za ostale detalje pogledajte opis funkcije. Sljedeći primjer pokazuje učinkovita metoda brojanje broja bitova jedan u varijabli $mask:

$setbits = unpack("%32b*", $mask);

vec funkcija

Sintaksa :vec izraz, pristranost, širina Argumenti: izraz string izraz pristranost, širina numerički izrazi Proizlaziti: brojčana vrijednost

Funkcija vec gleda u žicu izraz kao niz koji se sastoji od elemenata zadanog širina u bitovima. Dohvaća element s danim istisnina i vraća ga. Širina mora biti stepen 2 u rasponu od 1 do 32 (ili 64 na 64-bitnim platformama), pristranost tretira se kao cijeli broj bez predznaka. Primjer:

$x = "\x10\x32\x54"; # $x = (0, 1, 2, 3, 4, 5) kao vektor 4-bitnih brojeva ispis vec($x, 2, 4); # tako da će broj 2 biti ispisan

Funkcija vec može se koristiti na lijevoj strani operatora dodjele za formiranje niza grupa bitova u nizu. Na primjer, mogli bismo formirati niz $x iznad ovako:

Funkcija quotemeta dodaje znak "\" nizu argumenata prije svakog znaka koji nije latinično pismo ili broj i vraća se nova linija kao rezultat.

Ako je argument izostavljen, pretpostavlja se da je jednak vrijednosti varijable $_. Ovo je interna funkcija koja implementira metakarakter \Q. Primjer:

podijeljena funkcija

Sintaksa : podjela uzorak, crta, ograničiti Argumenti: uzorak regularni izraz crta string izraz ograničiti brojčani izraz Proizlaziti: popis nizova

Funkcija podjela dijeli original crta u podnizove i vraća popis tih podnizova. U skalarnom kontekstu, pohranjuje popis podnizova u @_ polje i vraća njegovu duljinu. Ako crta izostavljena, tada se pretpostavlja da je jednaka vrijednosti varijable $_. Dijeljenje u podnizove događa se na odgovarajućim pozicijama s datim uzorak; ako je izostavljen, tada se razdvajanje izvodi na znaku razmaka, dok vodeći prostori u svakom podnizu se uklanjaju. Ako uzorak sadrži zagrade, tada su podnizovi koji odgovaraju izrazu u zagradama uključeni kao zasebni elementi u rezultirajuću listu.

Ako ograničiti je zadan i pozitivan, tada navodi najveći dopušteni broj podnizova koji se trebaju izdvojiti. Ako je izostavljen ili jednak nuli, prazni prazni podnizovi nisu uključeni u rezultirajući popis. Ako je negativan, vraćaju se svi ekstrahirani podnizovi. Primjeri:

@_ = podijeli(/,/, "a,b,c,d,"); # @_ = ("a", "b", "c", "d") @_ = split(/,/, "a,b,c,d,", 3); # @_ = ("a", "b", "c,d,") @_ = podijeli(/,/, "a,b,c,d,", -3); # @_ = ("a", "b", "c", "d", "") @_ = split(/(,)/, "a,b,c,d,"); # @_ = ("a", ",", "b", ",", "c", ",", "d", ",")

funkcija proučavanja

Sintaksa : studija crta Argumenti: crta string izraz Proizlaziti: Ne

Funkcija studija sastavlja crta(ili vrijednost varijable $_ ako je izostavljena) u internu reprezentaciju. Ako crta Ako želite podudarati uzorak više puta, njegovo sastavljanje može uštedjeti vrijeme na kasnijim operacijama podudaranja. Samo jedan redak se može kompajlirati odjednom; primjena funkcije studija u drugu liniju poništava kompilaciju tekuće linije. Primjer:

Dok(<>) (prouči; ispis "Moje\n" ako /\bme\b/; ispis "Tvoj\n" ako /\ti\b/; ... )

Problem

Morate stvoriti vezu za pozivanje potprograma. Ovaj problem nastaje pri stvaranju rukovatelja signalima, neizravno nazvanih Tk funkcijama, i pokazivača na hash funkcije.

Riješenje

Dobivanje reference na funkciju: $cref = \ $cref = sub (...); Pozivanje funkcije prema referenci: @returned = $cref->(@arguments); @vraćeno = &$cref (@argumenti);

Komentar

Da biste dobili referencu na funkciju, samo njenom imenu dodajte \&. Osim toga, formulacija sub() omogućuje vam stvaranje anonimnih funkcija. Anonimna referenca funkcije može se pohraniti kao i svaka druga. Perl 5.004 uveo je postfiksnu notaciju za dereferenciranje referenci funkcija. Da biste pozvali funkciju prema referenci, prethodno ste morali napisati &$funcname (@ARGS), gdje je $funcname naziv funkcije. Mogućnost spremanja naziva funkcije u varijablu postoji i danas: $funcname = "thefunc"; &$funcname(); međutim, takvo je rješenje nepoželjno iz više razloga. Prvo, koristi simboličke, a ne stvarne (tvrde) poveznice, tako da uz korištenje striktne "refs" direktive na snazi, više nije potrebno. Simboličke veze općenito se ne preporučuju jer ne mogu pristupiti leksičkim varijablama, već samo globalnim varijablama i za njih nema brojanja referenci. Drugo, ne sadrži podatke o paketu, pa bi izvođenje fragmenta u drugom paketu moglo pozvati neispravna funkcija. Konačno, ako je funkcija nadjačana u nekom trenutku (iako se to ne događa često), simbolička vezaće kontaktirati trenutna definicija funkcije, a tvrda veza će zadržati staru definiciju. Umjesto pohranjivanja naziva funkcije u varijablu, stvorite referencu na nju koristeći \ operator. Ovako biste trebali pohraniti funkciju u varijablu ili je proslijediti drugoj funkciji. Reference imenovanih funkcija mogu se kombinirati s referencama anonimnih funkcija: %commands = ("happy" => \&joy, "sad" => \&sullen, "done" => sub ( die "Vidimo se!"), "mad" = > \&ljut,); print "Kako si?"; žvakati ($string = ); if ($commands($string)) ( $commands($string)->(); ) else ( print "Nema takve naredbe: $string\n"; ) Ako stvorite anonimnu funkciju koja upućuje na leksički(m) varijable iz opsega koji sadrži, shema brojanja referenci osigurava da se memorija leksičke varijable ne oslobađa ako postoje reference na nju: sub counter_maker ( my $start = 0; return sub ( # Closure return $start++; # Leksička varijabla ); # iz opsega koji sadrži scope ) $counter = counter_maker(); for ($i =0; $i Iako je counter_maker završio i $start je izašao iz opsega, Perl ga ne oslobađa jer anonimni potprogram (na koji upućuje $counter) još uvijek sadrži referencu na $start. Ako pozovete counter_maker opet, funkcija će vratiti referencu na drugu anonimnu rutinu koristeći drugu vrijednost $counter1 = counter_maker(); 0 1 2 3 4 5 0 Zatvaranja se često koriste u neizravno pozvanim funkcijama (povratni pozivi). U grafičkim korisničkim sučeljima i općenito u programiranju temeljenom na događajima, određeni dijelovi koda povezani su s događajima pritiska tipke, klikovima mišem, događajima prikaza prozora, itd. Ovaj se kod poziva mnogo kasnije, možda iz potpuno drugačijeg opsega. Varijable korištene u zatvaranju moraju biti dostupne u vrijeme poziva. Da bi ispravno radili, moraju biti leksički, a ne globalni. Zatvaranja se također koriste u generatorima funkcija, a to su funkcije koje stvaraju i vraćaju druge funkcije. Funkcija counter_maker je generator. Evo još jednog jednostavnog primjera: sub timestamp ( my $start_time = time(); return sub ( return time() - $start_time ); ) $early = timestamp(); spavanje 20; $kasnije = vremenska oznaka(); spavanje 10; printf "Prošlo je %d sekundi od ranije.\n", $rano->(); printf "Prošlo je %d sekundi od kasnije.\n", $kasnije->(); Prošlo je 30 sekundi od početka. Prošlo je 10 sekundi od kasnije. Svaki poziv vremenske oznake generira i vraća nova značajka. Funkcija timestamp stvara leksičku varijablu $start_time koja sadrži trenutno vrijeme (u sekundama od epohe). Svaki put kad se pozove zatvaranje, vraća broj sekundi koje su prošle, što se određuje oduzimanjem vremena početka od trenutnog vremena.

Umeće prostor imena jednog modula u drugi. Ovo nije ugrađena funkcija, već samo metoda naslijeđena od modula (parametar MODULE) koja treba izvesti svoja imena (parametar LIST) u drugi modul.

Uvezi POPIS MODULA

lokalni

Funkcija local() koristi se za deklariranje i inicijaliziranje jedne ili više varijabli:

Lokalni EXPR lokalni ($myvar, , %myhash); lokalni $pi = 3,14159; lokalno ($pi, $exp) = (3,14159, 2,71828);

ali, za razliku od funkcije my(), ne stvara lokalne varijable, već privremene vrijednosti za globalne varijable unutar:

  • potprogrami;
  • blok izjava u vitičastim zagradama;
  • izraz proslijeđen za izvršavanje funkcije eval();
  • datoteka;

Ovisno o tome gdje se sama funkcija local() poziva za deklariranje varijabli. Ako se funkcija local() koristi za deklariranje više varijabli, one se moraju staviti u zagrade. Ako je globalna varijabla deklarirana pomoću ove funkcije prethodno naiđena prije deklaracije i imala je neku vrijednost, tada je ta vrijednost pohranjena na skrivenom stogu i vraćena nakon izlaska iz potprograma, bloka, funkcije eval() ili datoteke. Varijabla deklarirana funkcijom local(), točnije njezina privremena vrijednost, dostupna je svakoj funkciji pozvanoj unutar potprograma, bloka, funkcije eval() ili datoteke u kojoj je deklaracija napravljena. Takva se varijabla naziva dinamičkom, a njezin opseg naziva se dinamički opseg. Naziv odražava činjenicu da se opseg varijable dinamički mijenja svakim pozivom funkcije koja pristupa toj varijabli.

Primjer:

moj

Funkcija my() koristi se za deklariranje jedne ili više varijabli kao lokalnih:

i ograničava njihov opseg:

  • potprogram;
  • blok izjava u vitičastim zagradama;
  • izraz proslijeđen za izvršavanje funkcije eval();
  • datoteku, ovisno o tome gdje se sama funkcija my() poziva za deklariranje varijabli.

Ako EXPR izraz sadrži popis varijabli, on mora biti u zagradama:

Moj ($myvar, @mylist, %myhash);

Istovremeno s deklaracijom mogu se inicijalizirati varijable:

Moj $pi = 3,14159; moj ($pi, $exp) = (3,14159, 2,71828);

Varijable deklarirane pomoću funkcije my() dostupne su u svom opsegu samo rutinama definiranim u tom opsegu. Nisu dostupni za rutine definirane izvan njega. Takve se varijable nazivaju leksičkim, a sam opseg naziva se leksičkim ili statičkim opsegom.

Primjer:

Sub f1( local ($x) = "aaaa"; my($y) = "bbbb"; print("f1: x = $xn"); print("f1: y = $ynn"); f2() ; print("f1: x = $ynn"); print("f2: y = $ynn"); print("f2: y = $ynn" ); $x = "dddd"; print("f2: y = $ynn");

Rezultat izvršenja ovaj primjer bit će sljedeći izlaz:

F1: x = aaaa f1: y = bbbb f2: x = aaaa f2: y = f2: x = cccc f2: y = dddd f1: x = cccc f1: y = bbbb

Kao što možete vidjeti iz gornjeg rezultata, funkcija f2() nema pristup varijabli $y deklariranoj pomoću funkcije my() unutar funkcije f1(), već, naprotiv, ima pristup varijabli $x deklariran unutar f1() pomoću funkcije local().

paket

Definira zasebni globalni imenski prostor (paket): svi nedefinirani dinamički identifikatori (uključujući one deklarirane putem local(), ali ne i my()) bit će pohranjeni u njemu. Da biste im pristupili izvan paketa, morate navesti prefiks koji predstavlja naziv paketa iza kojeg slijede dvije dvotočke "::". Opseg varijabli paketa proteže se do kraja bloka iskaza u kojem se paket nalazi ili do nove deklaracije paketa. Ako je naziv paketa izostavljen, to prisiljava sve identifikatore da budu navedeni, uključujući nazive funkcija.

Paket [PACKAGE_NAME]

koristiti

Učitava modul tijekom kompajliranja; ako modul nije dostupan, kompilacija cijelog programa se zaustavlja.

Koristite POPIS MODULA koristite MODULE koristite MODULE VERSION LIST koristite VERSION