Προειδοποιήσεις#

Μη μοιραία διαγνωστικά. Μια προειδοποίηση εκτυπώνει μία γραμμή στο 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».