_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/exec - palieka dabartinę programą tam, kad paleisti kitą
  • exec LIST
  • exec PROGRAM LIST

    exec funkcija atlieka sisteminę komandą ir niekada nieko negrąžina-- jei norima grąžinimo -- reiktų naudoti system vietoj exec. Iškvietimas nepavyksta ir grąžinamas false tik jei komanda neegzistuoja ir ji yra paleidžiama tiesiogiai, o ne per sistemos komandinį shell'ą (žr.apačioj).

    Kadangi tai pakankamai dažna klaida - naudoti exec vietoj system, Perl įspėja, jei yra sakinių, kuriuose nėra die, warn, ar exit (jei yra užsetintas -w - bet taip daroma visada). Jei tikrai norima po exec prirašyti kitų sakinių, galima išmėginti vieną šių variantų, kad išventumėte įspėjimo:

        exec ('foo')   or print STDERR "couldn't exec foo: $!";
        { exec ('foo') }; print STDERR "couldn't exec foo: $!";

    Jei LIST'e yra daugiau negu vienas argumentas, arba jei LIST yra masyvas su daugiau nei viena reikšme, iškviesti execvp(3) su argumentais LIST'e. Jei yra tik vienas skalaras arba masyvas su vienu elementu jame, argumentas yra tikrinamas ir ieškoma shell'o metasimbolių, ir jei jų randama, visas argumentas perduodamas sistemos komandiniam shellui gramatiniam nagrinėjimui (parsinimui) (tai yra/bin/sh -c Unixinėms platformoms ir gali būti įvairūs kitokie kitose platformose). Jei nėra shell'o metasimbolių argumente, jis išskaidomas į atskirus žodžius ir perduodamas tiesiai execvp , kuris yra veiksmingesnis. Pavyzdžiai:

        exec '/bin/echo', 'argumentai:', @ARGV;
        exec "sort $outfile | uniq";

    Jei tikrai nenorima vykdyti pirmojo arguemnto, bet siekiama sumeluoti vykdomai programai apie jos pačios pavadinimą, galima aprašyti programą, kurią iš tiesų norma atlikti, kad ji būtų paleidžiama kaip "netiesioginis objektas" (be kablelio) prieš LIST. (Tai visada priverčia interpretuoti LIST kaip daugiareikšmį sąrašą, net jei ten tėra tik vienintelis skaliaras.) Pavyzdys:

        $shell = '/bin/csh';
        exec $shell '-sh';		# Apsimeta kad tai login shell'as

    ar labiau tiesiogiai,

        exec {'/bin/csh'} '-sh';	# tas past

    Kai argumentai vykdomi per sisteminį shell'ą, rezultatai bus keistumo ir galingumo klausimas. Žr. "`STRING`" perlop'e dėl detalių.

    Naudojant netiesioginį objektą su exec arba system yra ir saugiau. Šis panaudojimas (taip pat veikia ir su system()) priverčia interpretuot argumentus kaip daugiareikšmį sąrašą, net jei sąrašas turi tik vieną argumentą. Tokiu būdu apsisaugoma nuo shell'ą išplečiančių specialių simbolių ar žodžių skaidymo, kai juose yra tarpai.

        @args = ( "echo surprise" );
        exec @args;               # išeina į shell'a
                                    # jei @args == 1
        exec { $args[0] } @args;  # saugu net su vieno argumento sąrašu

    Pirmoji versija, be netiesioginio objekto, paleido echo programą, jai pateikdama "surprise" argumentą. Antroji versija ne - ji mėgino paleisti programą tiesiog iškviesdama "echo surprise", jo nerado ir užsetino $? nenulinę reikšmę, parodančią klaidą.

    Pradedant su v5.6.0, Perl mėgins sujungt į vieną visus atidarytus failus išvedimui prie vykdant, bet tai gali būti nepalaikoma kai kuriose platformose (žr. perlport). Kad apsisaugotumėte, reikia užsetinti$| ($AUTOFLUSH ) arba iškviesti autoflush()IO::Handle metodą atidarytiems handle'ams kad išvengti išvedimo praradimo.

    Pažymėtina, jogexec neiškvies END blokų, nei DESTROY metodų objektuose.

algirdas@perl.lt 2005.04.11 - $dabar