indietro

  • -X FILEHANDLE
  • -X EXPR
  • -X

    Un test sul file, dove X è una delle lettere elencate di seguito. Questo operatore unario opera su un argomento, o un nome di file o un filehandle, e controlla il file associato per verificare la verità di una condizione. Se si omette l'argomento, utilizza il valore corrente di $_; fa eccezione -t, che utilizza STDIN. A meno di indicazione contraria, restituisce 1 per indicare la verità della condizione verificata, e '' in caso di falsità, mentre restituisce un valore non definito se il file non esiste. A dispetto della stranezza dei nomi, valgono le stesse regole di precedenza di ogni altro operatore unario, e l'argomento può essere racchiuso fra parentesi come per qualsiasi altro operatore. L'operatore può essere uno qualsiasi fra quelli seguenti:

        -r	Il file e` leggibile da parte del uid/gid effettivo.
        -w	Il file e` scrivibile da parte del uid/gid effettivo.
        -x	Il file e` eseguibile da parte del uid/gid effettivo.
        -o	Il file appartiene al uid effettivo.
        -R	Il file e` leggibile da parte del uid/gid reale.
        -W	Il file e` scrivibile da parte del uid/gid reale.
        -X	Il file e` eseguibile da parte del uid/gid reale.
        -O	Il file appartiene al uid reale.
        -e	Il file esiste.
        -z	Il file ha dimensione zero (e` vuoto).
        -s	Il file ha dimensione diversa da zero (restituisce la dimensione in byte).
        -f	Il file e` un file vero e proprio [non una directory ma un link, NdT]
        -d	Il file e` una directory.
        -l	Il file e` un link simbolico.
        -p	Il file e` una named pipe (FIFO), o la Filehandle e` una pipe.
        -S	Il file e` un socket.
        -b	Il file e` un file speciale per una periferica a blocchi.
        -c	Il file e` un file speciale per una periferica a caratteri.
        -t	La filehandle e` aperta su una tty [per esempio un terminale, NdT].
        -u	Il file ha il bit setuid impostato.
        -g	Il file ha il bit setgid impostato.
        -k	Il file ha lo sticky bit impostato.
        -T	Il file contiene un testo ASCII (viene determinato in maniera euristica).
        -B	Il file e` un file binario (opposto di -T).
        -M	Orario di avvio dello script meno l'orario di ultima modifica del file, in giorni.
        -A	Come sopra, ma con l'orario di ultimo accesso al file.
        -C	Come sopra, ma per l'orario di ultima modifica del inode (su Unix, potrebbe essere diverso su un'altra piattaforma).

    Esempio:

        while (<>) {
    	chomp;
    	next unless -f $_;	# ignora i file speciali
    	#...
        }

    L'interpretazione degli operatori che verificano i permessi dei file -r, -R, -w, -W, -x e -X è basata di default solamente sullo stato del file e sul valore degli uid e gid dell'utente. Ci potrebbero essere altre ragioni per cui vi potrebbe risultare impossibile leggere, scrivere o eseguire il file. Tali ragioni potrebbero essere ad esempio controlli di accesso su un filesystem di rete, ACL (Access Control lists, [liste di controllo di accesso, NdT]), filesystem accessibili in sola lettura, e formati eseguibili non riconosciuti.

    Va notato inoltre che, per il superuser sui filesystem locali, gli operatori -r, -R, -w e -W restituiscono sempre 1, e -x e -X restituiscono 1 se uno qualsiasi dei bit di esecuzione è impostato. Gli script eseguiti dal superuser devono perciò utilizzare la funzione stat() per determinare il reale stato del file, oppure devono temporaneamente impostare il loro uid effettivo ad un valore diverso.

    Se state usando le ACL, c'è una direttiva chiamata filetest che può produrre risultati più accurati di quelli ottenibili con un semplice stat(). Con la direttiva use filetest 'access' in uso, gli operatori sopra citati verificheranno i permessi utilizzando la famiglia di chiamate a sistema operativo access(). Va notato inoltre che quando questa direttiva è in uso, gli operatori -x e -X potrebbero restituire il valore booleano vero anche se i bit di esecuzione non sono impostati sui file (così come potrebbe accadere anche se nessun ulteriore permesso di eseguibilità è stato garantito da una ACL). Queste stranezze sono dovute alle definizioni del sistema operativo su cui operano. Leggete la documentazione di filetest per avere maggiori informazioni.

    Va notato che -s/a/b/ non è la negazione di una sostituzione. Scrivere -exp($pippo) funziona sempre come ci si aspetta che faccia, solo le lettere singole che seguono un segno meno sono interpretate come test sui file.

    Gli operatori -T e -B funzionano nel modo seguente. Il primo blocco (più o meno) del file viene esaminato alla ricerca di caratteri strani come ad esempio codici di controllo o caratteri con il bit alto impostato. Se vengono individuati troppi caratteri strani (>30%), l'operatore -B restituisce vero; altrimenti restituirà vero l'operatore -T. Inoltre, un qualunque file che contiene un carattere "null" nel primo blocco è considerato binario. Se -T o -B vengono usati su un filehandle, viene esaminato il buffer di IO corrente, e non il primo blocco. Sia -T che -B restituiscono il valore booleano vero su un file vuoto, o su un filehandle che è arrivata alla fine del file. Poiché eseguendo -T deve avvenire una lettura del file, nella maggior parte delle occasioni ha senso eseguire un -f sul file come prima cosa, come ad esempio in next unless -f $file && -T $file.

    Se a uno qualsiasi dei test sui file (o uno fra gli operatori stat e lstat) viene richiesto di esaminare lo speciale filehandle costituito da un trattino di sottolineatura "_", verrà utilizzata il risultato della chiamata stat effettuata dall'ultimo test sul file o operatore stat, in modo da risparmiare una chiamata a sistema operativo. (Questo non vale per -t, e dovrete ricordare anche che lstat() e -l memorizzeranno il risultato della chiamata stat relative al link simbolico stesso, e non quelle relative al file puntato dal link). (Inoltre, se il buffer della chiamata stat è stato precedentemente riempito da una chiamata lstat, -T e -B verranno reimpostati al valore restituito da stat _). Esempio:

        print "Si puo` fare.\n" if -r $a || -w _ || -x _;
        stat($filename);
        print "Leggibile\n" if -r _;
        print "Scrivibile\n" if -w _;
        print "Eseguibile\n" if -x _;
        print "Setuid\n" if -u _;
        print "Setgid\n" if -g _;
        print "Sticky\n" if -k _;
        print "Testo\n" if -T _;
        print "File binario\n" if -B _;