Ενδοσκόπηση διερμηνέα#
Μεταβλητές που εκθέτουν τον τρέχοντα διερμηνέα Perl και τη ρύθμισή του. Ο περισσότερος κώδικας ποτέ δεν τις αγγίζει· οι περιπτώσεις όπου έχουν σημασία είναι έλεγχοι έκδοσης, λογική υπό συνθήκη OS, hooks profiler, και επιτόπια επεξεργασία.
Μεταβλητή | Κρατά |
|---|---|
| Έκδοση Perl ως αριθμητική συμβολοσειρά ( |
| Έκδοση Perl ως αντικείμενο |
| Όνομα λειτουργικού συστήματος ( |
| Διαδρομή προς το τρέχον εκτελέσιμο Perl/PetaPerl |
| Χρόνος βάσης διεργασίας (δευτερόλεπτα Unix epoch) |
| Κεντρικός διακόπτης προειδοποιήσεων (λογική τιμή) |
| Επέκταση επιτόπιας επεξεργασίας (τίθεται από |
| Μάσκα bits σημαιών αποσφαλματωτή |
| Αποτέλεσμα τελευταίου μπλοκ κώδικα regex |
| Κατάσταση χειρισμού εξαιρέσεων (εντός |
| Τρέχουσα φάση διερμηνέα ( |
$] - αριθμητική έκδοση#
Μια αναπαράσταση κινητής υποδιαστολής της έκδοσης του διερμηνέα. Μορφή: 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. Κρατά μία από τρεις τιμές:
| Σημασία |
|---|---|
| Ανάλυση ενός module, ενός |
| Εκτέλεση εντός ενός μπλοκ |
| Οπουδήποτε αλλού |
Η κατάσταση 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:
Φάση | Πότε |
|---|---|
| Μέσα στον κατασκευαστή διερμηνέα σε επίπεδο C |
| Μπλοκ |
| Μετά τη μεταγλώττιση, πριν το |
| Μπλοκ |
| Εκτέλεση κύριου προγράμματος |
| Μπλοκ |
| Καθολική καταστροφή |
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).