# Προειδοποιήσεις Μη μοιραία διαγνωστικά. Μια προειδοποίηση εκτυπώνει μία γραμμή στο `STDERR` και το πρόγραμμα συνεχίζει. Οι σοβαρές (**S**) προειδοποιήσεις εκτυπώνονται ακόμη και χωρίς την pragma `warnings`· οι απλές **W** προειδοποιήσεις εκτυπώνονται μόνο όταν είναι ενεργοποιημένες οι προειδοποιήσεις για την κατηγορία τους: ```perl 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)** Μια υπορουτίνα έχει καλέσει τον εαυτό της (απευθείας ή μέσω αλυσίδας) σε βάθος μεγαλύτερο από εκατό επίπεδα. Αυτό συνήθως είναι μια ανεξέλεγκτη αναδρομή - μια βασική περίπτωση που δεν ενεργοποιείται ποτέ - παρά πραγματικά βαθιά εργασία. Το μήνυμα ονομάζει την υπορουτίνα. ```perl 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. ``` Διορθώστε τη βασική περίπτωση. Αν η αναδρομή πράγματι προορίζεται να τρέξει σε βάθος, σιγάστε την κατηγορία για αυτή την εμβέλεια: ```perl no warnings 'recursion'; ``` ## Ευρείς χαρακτήρες ### ``Wide character in %s`` **(S)** Μια συμβολοσειρά που περιέχει έναν χαρακτήρα πάνω από το σημείο κώδικα 255 στάλθηκε σε μια λειτουργία προσανατολισμένη στα bytes - συχνότερα `print` σε ένα filehandle χωρίς στρώμα `:encoding`. Η Perl εκπέμπει τα bytes της εσωτερικής μορφής UTF-8 και προειδοποιεί, επειδή στο ρεύμα εξόδου δεν δηλώθηκε ποτέ ότι θα μετέφερε Unicode. ```perl use warnings; print "café\x{2603}\n"; # Wide character in print at ... line 2. ``` Η διόρθωση είναι να δηλώσετε στο ρεύμα την κωδικοποίησή του: ```perl 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 (`(?...)`) περιέχει έναν χαρακτήρα που δεν επιτρέπεται σε όνομα ομάδας. Τα ονόματα ομάδων ακολουθούν τους κανόνες των αναγνωριστικών - γράμματα, ψηφία, και κάτω παύλα, χωρίς να ξεκινούν με ψηφίο. Το μοτίβο μεταγλωττίζεται και πάλι, αντιμετωπίζοντας την κατασκευή επιεικώς, αλλά το όνομα είναι ύποπτο. ## Κωδικοποίηση ### ``Cannot find encoding "%s"`` **(S)** Ένα στρώμα `:encoding(...)` ή μια κλήση `Encode` ονόματισε μια κωδικοποίηση που δεν είναι διαθέσιμη. Ελέγξτε τη γραφή σε σχέση με τις κωδικοποιήσεις που υποστηρίζει το `Encode` (`UTF-8`, `Latin-1`, `ASCII`, και τις υπόλοιπες). ## Γενικής χρήσης ### ``Warning: something's wrong`` **(W)** Μια γενική προειδοποίηση που εγείρει η παραγωγή κώδικα για μια συνθήκη που δεν έχει πιο συγκεκριμένο μήνυμα. Το γύρω περιβάλλον ονομάζει το τι την προκάλεσε. ## Δείτε επίσης - `warnings` - η pragma που ενεργοποιεί, οριοθετεί, και κατηγοριοποιεί κάθε **W** προειδοποίηση. - [`$SIG{__WARN__}`](../perlvar/signals.md) - υποκλέψτε προειδοποιήσεις κατά τον χρόνο εκτέλεσης αντί να τις αφήνετε να φτάσουν στο `STDERR`. - [Σφάλματα μεταγλώττισης regex](fatal-regex.md) - τα μοιραία διαγνωστικά regex, σε αντιδιαστολή με αυτά εδώ που είναι σε επίπεδο προειδοποίησης. - [`Encode`](../../Encode.md) - τα ονόματα κωδικοποιήσεων πίσω από την προειδοποίηση «Cannot find encoding».