_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/require - užkrauti išorines funkcijas iš bibliotekos paleidimo metu
  • require VERSION
  • require EXPR
  • require

    Reikalauja Perl versijos, aprašytos VERSION arba semantikos, aprašytos EXPR ar $_, jei EXPR nepateiktas.

    VERSION gali būti arba skaitinis argumentas, toks kaip 5.006, kuris bus lyginamas su $] , arba raidinis, toks kaip v5.6.1, kuriuo atveju bus lyginama su $^V (aka $PERL_VERSION). Lemtinga klaida yra parodoma paleidimo metu, jei VERSION yra didesnė negu dabartinio Perl interpretatoriaus. Palyginimui use, kuris gali atlikti panašų patikrinimą kompiliavimo metu.

    Aprašant VERSION kaip raidine v5.6.1 forma geriau reikėtų vengti, nes šis atvejis dažnai atveda į klaidinančias klaidų žinutes ankstesnėse Perl versijose, kurios nepalaikė sintaksės. Geriau naudoti atitinkama skaitinę versiją.

        require  class=v>v5.6.1;	# run time version check
        require  class=v>5.6.1;	# ditto
        require 5.006_001;	# ditto; preferred for backwards compatibility

    Kitu atveju reikalauja, kad bibliotekos failas būtų įterptas, jei to dar nebuvo padaryta. Failas įterpiamas per do-FILE mechanizmą, kuris iš tikrųjų yra tik įvairūs eval. Turi semantiką, panašią į štai šią paprogramę:

        sub require {
           my ($filename) = @_;
           if (exists $INC{$filename}) {
               return 1 if $INC{$filename};
               die "Compilation failed in require";
           }
           my ($realfilename,$result);
            ITER: {
               foreach $prefix (@INC) {
                   $realfilename = "$prefix/$filename";
                   if (-f $realfilename) {
                       $INC{$filename} = $realfilename;
                       $result = do $realfilename;
                       last  ITER;
                   }
               }
               die "Can't find $filename in \@INC";
           }
           if ($@) {
               $INC{$filename} = undef;
               die $@;
           } elsif (!$result) {
               delete $INC{$filename};
               die "$filename did not return true value";
           } else {
               return $result;
           }
        }

    Įsidėmėkite, kad failas nebus įterptas du kartus po tuo pačiu nurodytu vardu.

    Failas privalo gražinti true kaip paskutinį sakinį, parodydamas sėkmingą inicializacijos kodo vykdymą, taigi tradiciška baigti tokį failą reikšme 1; nebent esate tikri jis kitokiais būdais gražins true. Bet geriau tiesiog įdėti 1; tam atvejui, jei kartais pridėsite daugiau sakinių.

    Jei EXPR yra tik žodis, reikalavimas priima ".pm" plėtinį ir pakeičia "::" - "/" failo varde, kad būtų paprasčiau užkrauti standartinius moduliu. Ši modulių krovimo forma nerizikuoja keisti vardų zonos.

    Kitaip sakant jei mėginsite šitai:

            require Foo::Bar;    # a splendid bareword

    require funkcija ieškos "Foo/Bar.pm" failo direktorijose, aprašytose @INC masyve.

    Bet jei mėginsite šitai:

            $class = 'Foo::Bar';
            require $class;	     # $class is not a bareword
        #ar
            require "Foo::Bar";  # not a bareword because of the ""

    funkcija ieškos "Foo::Bar" failo @INC masyve ir skųsis neradusi "Foo::Bar". Šiuo atveju galima elgtis taip:

            eval "require $class";

    Kai dabar suprantate kaip require ieško failų kai taip pateikiamas argumentas, štai dar viena ekstra-galimybė. Prieš tai kai require ieško ".pm" plėtinio, pirmiausia peržvelgs failų vardus su ".pmc" plėtiniu. Failas su tokiu plėtiniu yra tariamas Perlo baitkodas, sugeneruotas B::Bytecode. Jei randamas šis failas ir jo modifikacijos laikas yra naujesnis nei atitinkamo ".pm" nekompiliuoto failo, jis bus užkrautas į tą nekompiliuoto failo pabaigą ".pm" plėtinyje.

    Taip pat galima įterpti kabliukus (hooks) importavimo infrastruktūrai, įdedant Perl kodą tiesiai į @INC masyvą. Yra trys tokios formos: rodyklės į paprogrames, masyvus ir palaiminti objektai (blessed objects).

    Paprogramių rodyklės yra paprasčiausias variantas. Kai įterpimo sistema eina per @INC ir randa paprogramę, ši paprogramė iškviečiama su dviem parametrais, kai pirmas yra rodyklė į jį patį, o antras - failo, kuris bus įterptas, pavadinimas (t.y. "Foo/Bar.pm"). Paprogramė turėtų gražinti undef arba failo valdiklį, iš kurio failas, kurį ruošiamasi įterpti, bus nuskaitytas. Jei gražinamas undef, require peržvelgs likusius @INC elementus.

    Jei kabliukas (hook) yra rodyklė į masyvą, jo pirmas elementas turi būti paprogramės rodyklė. Ši paprogramė yra iškviečiama kaip aukščiau, bet pirmas parametras yra masyvo rodyklė. Tai leidžia netiesioginį kai kurių argumentų perdavimą į paprogramę.

    Kitais žodžiais, galima užrašyti:

        push @INC, \&my_sub;
        sub my_sub {
    	my ($coderef, $filename) = @_;	# $coderef is \&my_sub
    	...
        }

    or:

        push @INC, [ \&my_sub, $x, $y, ... ];
        sub my_sub {
    	my ($arrayref, $filename) = @_;
    	# Retrieve $x, $y, ...
    	my @parameters = @$arrayref[1..$#$arrayref];
    	...
        }

    Jei hook yra objektas, jis privalo duoti INC metodą, kuris bus iškviečiamas kaip aukščiau, kai pirmas parametras bus pats objektas. (Pažymėtina, kad reikia pilnai paruošti vardą, kadangi jis visada verčiamas į paketą main .) Štai tipiškas kodo gabaliukas:

        # In Foo.pm
        package Foo;
        sub new { ... }
        sub Foo::INC {
    	my ($self, $filename) = @_;
    	...
        }
        # In the main program
        push @INC, new Foo(...);

    Pažymėtina, kad šiems kabliukams taip pat leidžiama nustatyti %INC įvestį, atspidintį užkrautus failus. Žr. "%INC" perlvar'e.

    Dar galingesnei imortavimo infrastruktūrai žr. use ir perlmod.

algirdas@perl.lt 2005.04.11 - $dabar