Ενδοσκόπηση διερμηνέα#

Μεταβλητές που εκθέτουν τον τρέχοντα διερμηνέα Perl και τη ρύθμισή του. Ο περισσότερος κώδικας ποτέ δεν τις αγγίζει· οι περιπτώσεις όπου έχουν σημασία είναι έλεγχοι έκδοσης, λογική υπό συνθήκη OS, hooks profiler, και επιτόπια επεξεργασία.

Μεταβλητή

Κρατά

$]

Έκδοση Perl ως αριθμητική συμβολοσειρά (5.042000)

$^V

Έκδοση Perl ως αντικείμενο version (v5.42.0)

$^O

Όνομα λειτουργικού συστήματος (linux, darwin, …)

$^X

Διαδρομή προς το τρέχον εκτελέσιμο Perl/PetaPerl

$^T

Χρόνος βάσης διεργασίας (δευτερόλεπτα Unix epoch)

$^W

Κεντρικός διακόπτης προειδοποιήσεων (λογική τιμή)

$^I

Επέκταση επιτόπιας επεξεργασίας (τίθεται από -i)

$^P

Μάσκα bits σημαιών αποσφαλματωτή

$^R

Αποτέλεσμα τελευταίου μπλοκ κώδικα regex

$^S

Κατάσταση χειρισμού εξαιρέσεων (εντός eval; undef/0/1)

${^GLOBAL_PHASE}

Τρέχουσα φάση διερμηνέα (START, RUN, END, …)

$] - αριθμητική έκδοση#

Μια αναπαράσταση κινητής υποδιαστολής της έκδοσης του διερμηνέα. Μορφή: 5.PPPSSS όπου PPP είναι η κύρια και SSS η υποέκδοση:

print "$]\n";                    # e.g. "5.042000"
warn "old perl"  if "$]" < 5.038;
warn "new perl"  if "$]" >= 5.040;

Η μετατροπή σε συμβολοσειρά "$]" πριν τη σύγκριση συνιστάται - παρακάμπτει λεπτά ζητήματα αναπαράστασης κινητής υποδιαστολής που μπορεί να κάνουν τη $] == 5.042 να αποτύχει μυστηριωδώς.

Το ψευδώνυμο English $OLD_PERL_VERSION είναι τεκμηριωμένο αλλά αποθαρρύνεται· η ίδια η $] είναι εντάξει.

$^V - αντικείμενο έκδοσης#

Η έκδοση διερμηνέα ως αντικείμενο version, κατάλληλο για ανάγνωση και πλουσιότερη σύγκριση:

print "$^V\n";                   # "v5.42.0"
warn "need 5.40+" if $^V lt v5.40.0;

Η κυριολεκτική v5.40.0 είναι v-string - η εγγενής σύνταξη της Perl για σταθερές εκδόσεων. Χρησιμοποιήστε τη $^V όταν συγκρίνετε με κυριολεκτικά v-string· χρησιμοποιήστε τη $] όταν συγκρίνετε με σκέτους αριθμούς.

Στη PetaPerl, η $^V αναφέρει το υποκείμενο επίπεδο συμβατότητας Perl (5.42), όχι την έκδοση κυκλοφορίας της PetaPerl.

$^O - όνομα λειτουργικού συστήματος#

print "$^O\n";                   # "linux"
if ($^O eq 'MSWin32') {
    use_windows_path_separator();
}

Η PetaPerl είναι μόνο για Linux· η $^O είναι πάντα "linux". Η μεταβλητή υπάρχει για συμβατότητα πηγαίου κώδικα με φορητό κώδικα που διακλαδίζεται βάσει αυτής. Η πλήρης λίστα τιμών που μπορεί να παράξει η upstream Perl περιλαμβάνει linux, darwin, freebsd, openbsd, MSWin32, cygwin, solaris, και αρκετές ιστορικές καταχωρήσεις.

$^X - διαδρομή εκτελέσιμου#

Η διαδρομή προς τον τρέχοντα εκτελούμενο διερμηνέα, κατάλληλη για επανεκκίνηση:

print "$^X\n";                   # e.g. "/usr/local/bin/pperl"

# Rerun the script under the same interpreter, with extra args:
exec $^X, $0, @ARGV, '--debug';

Η $^X είναι αυτό που κάνει φορητή τη exec $^X, $0, ... - δεν χρειάζεται να γνωρίζετε αν το σενάριο εκκινήθηκε μέσω pperl, /usr/bin/env perl, ή απόλυτης διαδρομής.

$^T - χρόνος βάσης#

Το δευτερόλεπτο Unix epoch κατά το οποίο ξεκίνησε να εκτελείται το πρόγραμμα:

my $uptime = time() - $^T;
print "running for $uptime seconds\n";

Η κλασική χρήση είναι οι δοκιμές αρχείων -M και -A, που εξ ορισμού αναφέρουν ηλικίες αρχείων σχετικές με τη $^T αντί με τη time(). Αν θέσετε $^T = time() περιοδικά, αυτές οι δοκιμές αρχείων επανυπολογίζουν βάσει του νέου σημείου αναφοράς - χρήσιμο σε δαίμονες μεγάλης διάρκειας που χρειάζεται να αγνοούν αρχεία παλαιότερα από «αφότου ξεκίνησα αυτή τη δέσμη».

$^W - ο διακόπτης προειδοποιήσεων#

Η κεντρική σημαία προειδοποιήσεων, που τίθεται από τον διακόπτη γραμμής εντολών -w:

$^W = 1;                          # all warnings on
$^W = 0;                          # all warnings off

Η $^W είναι η καθολική σημαία εποχής Perl-1. Η σύγχρονη λεξιλογική pragma use warnings είναι ο συνιστώμενος τρόπος ελέγχου προειδοποιήσεων, και λειτουργεί ανεξάρτητα - ένα μπλοκ use warnings παραμένει ενεργό ανεξάρτητα από τη $^W, και ένα μπλοκ no warnings παραμένει ανενεργό ανεξάρτητα από τη $^W. Η μεταβλητή έχει σημασία κυρίως σε κώδικα που προηγείται της λεξιλογικής pragma ή που θέλει να εναλλάξει την καθολική προεπιλογή κατά τον χρόνο εκτέλεσης.

Η ${^WARNING_BITS} είναι ο λεξιλογικός χάρτης bits που διαβάζει και γράφει η use warnings. Η μορφή της είναι εσωτερική· μην βασίζεστε σε συγκεκριμένες θέσεις bits.

$^I - επέκταση επιτόπιας επεξεργασίας#

Τίθεται από τον διακόπτη γραμμής εντολών -i. Όταν η $^I είναι ορισμένη, η ανάγνωση από <> (η μορφή while (<>)) ξανα-ανοίγει κάθε αρχείο για ανάγνωση και εγγραφή και ανακατευθύνει τα επόμενα print στο ξαναγραμμένο αρχείο:

# perl -i.bak -ne 's/\bold\b/new/g; print' *.txt
# Equivalent in script form:
local $^I = '.bak';
while (<>) {
    s/\bold\b/new/g;
    print;
}

Η $^I = '' (κενή συμβολοσειρά) σημαίνει «ξαναγράψε επιτόπια χωρίς αντίγραφο ασφαλείας». Η $^I = '.bak' αποθηκεύει το πρωτότυπο ως <filename>.bak. Η ρύθμιση $^I = undef απενεργοποιεί την επιτόπια επεξεργασία.

$^P - μάσκα bits σημαιών αποσφαλματωτή#

Διαβάζεται από τον αποσφαλματωτή Perl· αν δεν είναι μηδέν, η DB::DB καλείται πριν από κάθε δήλωση. Χειρίζεται από τη perl -d και την οικογένεια αρθρωμάτων αποσφαλματωτή και profiler Devel::*.

Ο κώδικας χρήστη σπάνια θέτει τη $^P. Τα bits σημαιών τεκμηριώνονται στο upstream perlvar· η πιο συνηθισμένη τιμή είναι 0x73f (πλήρης αποσφαλμάτωση).

$^R - αποτέλεσμα μπλοκ κώδικα regex#

Το αποτέλεσμα της τελευταίας διεκδίκησης κώδικα regex (?{...}) ή (?(N)...). Ζει μόνο όσο διαρκεί η περιβάλλουσα αντιστοίχιση:

"abc123" =~ /(?<word>\w+?)(\d+)(?{ length($1) + length($2) })/;
print "$^R\n";                   # 6 - the code block's last expression

Η PetaPerl υποστηρίζει μπλοκ κώδικα regex (?{ })· δείτε το κεφάλαιο απόδοσης του οδηγού regex για τις λεπτομέρειες γλώσσας.

$^S - κατάσταση χειρισμού εξαιρέσεων#

Αναφέρει αν ο διερμηνέας βρίσκεται αυτή τη στιγμή εντός ενός eval. Κρατά μία από τρεις τιμές:

$^S

Σημασία

undef

Ανάλυση ενός module, ενός eval ή του κύριου προγράμματος

1 (αληθές)

Εκτέλεση εντός ενός μπλοκ eval ή try

0 (ψευδές)

Οπουδήποτε αλλού

Η κατάσταση undef είναι αυτή που έχει σημασία: μπορεί να εμφανιστεί εντός ενός χειριστή $SIG{__DIE__} ή $SIG{__WARN__}, όπου ο διερμηνέας μεταγλωττίζει αντί να εκτελεί. Ένας χειριστής που χρειάζεται να συμπεριφέρεται διαφορετικά κατά τη μεταγλώττιση την ελέγχει:

local $SIG{__DIE__} = sub {
    return if $^S;            # real runtime exception - let it propagate
    warn "compile-time failure: $_[0]";
};

Το παλαιό μακρύ όνομα (use English) είναι $EXCEPTIONS_BEING_CAUGHT, το οποίο είναι ελαφρώς παραπλανητικό: η τιμή undef δεν σας λέει αν οι εξαιρέσεις πιάνονται, διότι η μεταγλώττιση του κύριου προγράμματος δεν τις πιάνει.

${^GLOBAL_PHASE} - τρέχουσα φάση διερμηνέα#

Η τρέχουσα φάση κύκλου ζωής του διερμηνέα Perl:

Φάση

Πότε

CONSTRUCT

Μέσα στον κατασκευαστή διερμηνέα σε επίπεδο C

START

Μπλοκ BEGIN, use, require, μεταγλώττιση ανώτατου επιπέδου

CHECK

Μετά τη μεταγλώττιση, πριν το INIT

INIT

Μπλοκ INIT

RUN

Εκτέλεση κύριου προγράμματος

END

Μπλοκ END

DESTRUCT

Καθολική καταστροφή

END {
    if (${^GLOBAL_PHASE} eq 'END') {
        log_shutdown();           # we are still in user END
    }
}

# Inside a destructor, distinguish "object cleanup during normal
# scope exit" from "object cleanup during interpreter shutdown":
sub DESTROY {
    my $self = shift;
    if (${^GLOBAL_PHASE} eq 'DESTRUCT') {
        # global destruction - order is undefined, file handles
        # may already be torn down - be conservative
        return;
    }
    $self->{handle}->flush;
}

Ο φύλακας «μην εκτελέσεις κατά τη διάρκεια καθολικής καταστροφής» μέσα στη DESTROY είναι η κλασική περίπτωση χρήσης της μεταβλητής. Κατά τη DESTRUCT, η σειρά αποδόμησης αντικειμένων δεν είναι ορισμένη· οι αναφορές ενός αντικειμένου μπορεί να είναι ήδη άκυρες.

Δείτε επίσης#

  • use VERSION - ο συμβατικός τρόπος για απαίτηση ελάχιστης έκδοσης Perl, αντικαθιστώντας τη if "$]" < ....

  • require VERSION - ίδιο με use VERSION αλλά κατά τον χρόνο εκτέλεσης.

  • Config - η πλήρης ρύθμιση μεταγλώττισης Perl, πολύ πλουσιότερη από τη $^O και τη $].

  • use warnings - η λεξιλογική pragma που αντικαθιστά τη $^W για νέο κώδικα.

  • Διακόπτες γραμμής εντολών - τεκμηριώνει τους -i ($^I), -w ($^W), -d ($^P).