Προειδοποιήσεις#
Μη μοιραία διαγνωστικά. Μια προειδοποίηση εκτυπώνει μία γραμμή στο STDERR και το πρόγραμμα συνεχίζει. Οι σοβαρές (S) προειδοποιήσεις εκτυπώνονται ακόμη και χωρίς την pragma warnings· οι απλές W προειδοποιήσεις εκτυπώνονται μόνο όταν είναι ενεργοποιημένες οι προειδοποιήσεις για την κατηγορία τους:
use warnings; # all categories on
no warnings 'recursion'; # silence just deep-recursion
use warnings FATAL => 'utf8'; # make utf8 warnings die instead
Η κατηγορία σε ένα σήμα (W category) είναι ακριβώς η συμβολοσειρά που περνάτε στο no warnings.
Βαθιά αναδρομή#
`Deep recursion on subroutine "%s"`#
(W recursion) Μια υπορουτίνα έχει καλέσει τον εαυτό της (απευθείας ή μέσω αλυσίδας) σε βάθος μεγαλύτερο από εκατό επίπεδα. Αυτό συνήθως είναι μια ανεξέλεγκτη αναδρομή - μια βασική περίπτωση που δεν ενεργοποιείται ποτέ - παρά πραγματικά βαθιά εργασία. Το μήνυμα ονομάζει την υπορουτίνα.
use warnings;
sub countdown {
my $n = shift;
countdown($n + 1); # bug: should be $n - 1, never stops
}
countdown(1);
# Deep recursion on subroutine "main::countdown" at script line 5.
Διορθώστε τη βασική περίπτωση. Αν η αναδρομή πράγματι προορίζεται να τρέξει σε βάθος, σιγάστε την κατηγορία για αυτή την εμβέλεια:
no warnings 'recursion';
Ευρείς χαρακτήρες#
`Wide character in %s`#
(S) Μια συμβολοσειρά που περιέχει έναν χαρακτήρα πάνω από το σημείο κώδικα 255 στάλθηκε σε μια λειτουργία προσανατολισμένη στα bytes - συχνότερα print σε ένα filehandle χωρίς στρώμα :encoding. Η Perl εκπέμπει τα bytes της εσωτερικής μορφής UTF-8 και προειδοποιεί, επειδή στο ρεύμα εξόδου δεν δηλώθηκε ποτέ ότι θα μετέφερε Unicode.
use warnings;
print "café\x{2603}\n"; # Wide character in print at ... line 2.
Η διόρθωση είναι να δηλώσετε στο ρεύμα την κωδικοποίησή του:
binmode STDOUT, ':encoding(UTF-8)';
print "café\x{2603}\n"; # no warning; correct UTF-8 bytes
Αυτή είναι μια σοβαρή (S) προειδοποίηση: εκτυπώνεται ακόμη και χωρίς use warnings, επειδή η σιωπηρή εκπομπή ακατέργαστων εσωτερικών bytes είναι σχεδόν πάντα σφάλμα.
Άχρηστες κατασκευές#
`Useless use of \E`#
(W regexp) Ένα \E σε ένα μοτίβο ή συμβολοσειρά κλείνει ένα εύρος πεζών-κεφαλαίων/εισαγωγικών \U, \L, \Q που δεν άνοιξε ποτέ. Το \E δεν έχει τίποτα να τερματίσει. Αφαιρέστε το, ή προσθέστε το ανοίγον \U/\L/\Q που υποτίθεται ότι θα έκλεινε.
Ονόματα ομάδων#
`Invalid character in group name`#
(W) Μια ονομασμένη ομάδα regex ((?<name>...)) περιέχει έναν χαρακτήρα που δεν επιτρέπεται σε όνομα ομάδας. Τα ονόματα ομάδων ακολουθούν τους κανόνες των αναγνωριστικών - γράμματα, ψηφία, και κάτω παύλα, χωρίς να ξεκινούν με ψηφίο. Το μοτίβο μεταγλωττίζεται και πάλι, αντιμετωπίζοντας την κατασκευή επιεικώς, αλλά το όνομα είναι ύποπτο.
Κωδικοποίηση#
`Cannot find encoding "%s"`#
(S) Ένα στρώμα :encoding(...) ή μια κλήση Encode ονόματισε μια κωδικοποίηση που δεν είναι διαθέσιμη. Ελέγξτε τη γραφή σε σχέση με τις κωδικοποιήσεις που υποστηρίζει το Encode (UTF-8, Latin-1, ASCII, και τις υπόλοιπες).
Γενικής χρήσης#
`Warning: something's wrong`#
(W) Μια γενική προειδοποίηση που εγείρει η παραγωγή κώδικα για μια συνθήκη που δεν έχει πιο συγκεκριμένο μήνυμα. Το γύρω περιβάλλον ονομάζει το τι την προκάλεσε.
Δείτε επίσης#
warnings- η pragma που ενεργοποιεί, οριοθετεί, και κατηγοριοποιεί κάθε W προειδοποίηση.$SIG{__WARN__}- υποκλέψτε προειδοποιήσεις κατά τον χρόνο εκτέλεσης αντί να τις αφήνετε να φτάσουν στοSTDERR.Σφάλματα μεταγλώττισης regex - τα μοιραία διαγνωστικά regex, σε αντιδιαστολή με αυτά εδώ που είναι σε επίπεδο προειδοποίησης.
Encode- τα ονόματα κωδικοποιήσεων πίσω από την προειδοποίηση «Cannot find encoding».