_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/X - failo testavimas (-r, -x, t.t.)
  • -X FILEHANDLE
  • -X EXPR
  • -X

    Failo testas, kur X yra viena raidžių, išvardintų žemiau. Šis unarinis operatorius pasiima vieną argumentą, arba failo vardą, arba valdiklį ir testuoja failą, kad įsitikintų ar kažkas yra true apie jį. Jei argumentas praleistas, testuoja $_ , išskyrus -t , kuris tikrina STDIN. Kol kitaip nedokumentuotas, jis gražina 1 sėkmės atveju ir '' false atveju arba neapibrėžtą reikšmę, jei failas neegzistuoja. Nepaisant juokingų vardų, pirmenybė yra tokia pat kaip ir bet kokio kito su normaliu pavadinimu unarinio operatoriaus, o argumentas gali būti apskliaudžiamas kaip ir bet koks kitas unarinis operatorius. Operatorius gali būti bet kuris iš šių: -r-w-x-o-R-W-X-O-e-z-s-f-d-l-p -S-b-c-t-u-g-k-T-B-M-A-C

        -r	Failą gali nuskaityti efektyvaus uid/gid.
        -w	Į failą galima rašyti evektyvaus uid/gid.
        -x	Failas gali būti vykdomas efektyvaus uid/gid.
        -o	Failo savininkas yra efektyvus uid.
        -R	Failą gali nuskaityti tikras uid/gid.
        -W	Į failą galima rašyti tikras uid/gid.
        -X	Failas gali būti vykdomas tikro uid/gid.
        -O	Failo savininkas yra tikras uid.
        -e	Failas exists (egzistuoja).
        -z	Failas yra nulinio dydžio (jei tuščias).
        -s	Failas turi nenulinį dydį (gražina dydį baitais (bytes)).
        -f	Failas yra paprastas.
        -d	Failas yra direktorija.
        -l	Failas yra simbolinė nuoroda (link).
        -p	Failas yra pavadintas pipe'as (FIFO), arba failo valdiklis yra pipe'as.
        -S	Failas yra socket'as.
        -b	Failas yra bloko specialus failas.
        -c	Failas yra simbolio specialus failas.
        -t	Failo valdiklis yra atidarytas į tty.
        -u	Failas turi setuid bitų nustatymą.
        -g	Failas turi setgid bitų nustatymą.
        -k	Failas turi "sticky" bitų nustatymą .
        -T	Failas yra ASCII tekstinis failas (euristinis spėjimas).
        -B	Failas yra binarinis (priešinga -T).
        -M	Skripto paleidimo laikas minus failo pakeitimo laikas, dienomis.
        -A	Tas pats priėjimo laikui.
        -C	Tas pats inode pakeitimo laikui (Unix gali skirtis nuo kitų platformų)

    Pavyzdys:

        while (<>) {
    	chomp;
    	next unless -f $_;	# ignore specials
    	#...
        }

    Failo leidimų operatorių-r , -R , -w , -W , -x , and -X interpretacija yra pagal nutylėjimą paremta vien failo režimu ir vairtotojo uid bei gid. Gali būti priežasčių, dėl kurių negalima iš tikro nuskaityti, rašyti ar vykdyti failo. Tokios priežastys gali būti, pvz, tinklinės failų sistemos priėjimo kontrolė, ACL (access control list arba priėjimo kontrolės sąrašas), nekeičiamos failų sistemos bei neatpažinti vykdomieji formatai.

    Taip pat įsiminkite, jog, supervartotojui vietinėje failų sistemoje, -r , -R , -w ir -W testai visada gražina 1, o -x ir -X gražina 1, jei vykdymo bitai yra nustatyti režime. Skriptams, vykdomiems supervartotojo, gali tad reikėti padaryti stat(), kad apibrėžtų iš tikro esantį failo režimą arba laikinai nustatytų savo efektyvų uid į kokį nors kitą.

    Jei naudojate ACL, yra pragma, pavadinta filetest, kuri gali suteikti tikslesnius rezultatus nei pliki stat() režimo bitai. Po use filetest 'access' viršuj paminėti failų tikrinimai testuos ar leidimai gali (ne) būti suteikti naudojant access() sisteminių kvietimų šeimą. Taip pat įsidėmėkite, jog -x ir -X dėl šios pragmos veikimo gražinti true net jei nėra vykdymą leidžiančių bitų nustatymų (nei extra vykdymo leidimų ACL). Šis keistumas yra dėl pagrindinio sisteminių kvietimų apibrėžimo. Skaitykite dokumentaciją apie filetest pragmą dėl daugiau informacijos.

    Pažymėtina, jog -s/a/b/ nepaneigia pakeitimo. Sakant -exp($foo) vis dar veikia kaip tikėtąsi, visgi - tik vienišos raidės, po kurių seka minusai, yra interpretuojamos kaip failo testai.

    -T ir -B perjungikliai veikia taip. Pirmasis failo blokas ar pan. yra tikrinamas nuo neįprastinių simbolių, kaip kad keisti kontrolės kodai arba simboliai su aukštais bitų nustaymais. Jei randama pernelyg daug tokių keistų simbolių (>30%), tai yra -B failas, kitu atveju tai yra -T failas. Taip pat, bet kos failas, esantis tuščias pirmame bloke yra tariamas kaip binarinis failas. Jei -T ar -B yra naudojami ant failo valdiklio, einamasis IO buferis yra tikrinamas, o ne pirmasis blokas. Abu -T ir -B gražina true tuščio failo atveju arba failą, susidūrę su EOF, kai tirkinamas failo valdiklis. Kadangi reikia nuskaityti failą, kad padarytute -T testą, daugumoje atveju, norėsite pirmiausia panaudoti -f prieš failą, kaip kad next unless -f $file && -T $file .

    Jei bent vienam iš failų testų (arba stat, ar lstat operatorių atveju) yra paduodamas specialus failo valdiklis, susidedantis iš vienintelio pabraukimo, stat struktūra prieš tai buvusio failo testo (ar stat operatorius) yra panaudojami, išsaugant sisteminį kvietimą. (Tai neveikia su -t , tačiau reikia prisiminti, jog lstat() ir -l paliks reikšmes stat struktūroje simboliniam linkui, ne realiam failui.) (Taip pat, jei stat buferis buvo pripildytas lstat kvietimo, -T ir -B atstatys jį su stat _ rezultatais). Pavyzdžiai:

        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 _;
algirdas@perl.lt 2005.04.11 - $dabar