אזהרות#
דיאגנוסטיקות לא־קטלניות. אזהרה מדפיסה שורה אחת אל STDERR והתוכנית ממשיכה לרוץ. אזהרות החומרה (S) מודפסות אפילו בלי הפרגמה 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 נשלחה לפעולה מוכוונת־בתים - לרוב print אל מטפל קובץ ללא שכבת :encoding. Perl פולט את הבתים של צורת ה־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, משום שפליטה שקטה של בתים פנימיים גולמיים היא כמעט תמיד באג.
מבנים חסרי תועלת#
`Useless use of \E`#
(W regexp) ה־\E בתבנית או במחרוזת סוגר מקטע רישיות/ציטוט \U, \L, \Q שמעולם לא נפתח. אין ל־\E מה לסגור. הסירו אותו, או הוסיפו את הפותח \U/\L/\Q שאותו הוא נועד לסגור.
שמות קבוצה#
`Invalid character in group name`#
(W) קבוצה בעלת שם בביטוי רגולרי ((?<name>...)) מכילה תו שאינו מותר בשם קבוצה. שמות קבוצה מצייתים לכללי המזהים - אותיות, ספרות, וקו תחתון, לא מתחילים בספרה. התבנית עדיין מתהדרת, ומטפלת במבנה בסלחנות, אך השם חשוד.
קידוד#
`Cannot find encoding "%s"`#
(S) שכבת :encoding(...) או קריאת Encode נקבה בקידוד שאינו זמין. בדקו את האיות מול הקידודים ש־Encode תומך בהם (UTF-8, Latin-1, ASCII, וכל היתר).
תופס־הכול#
`Warning: something's wrong`#
(W) אזהרה גנרית שייצור הקוד מעלה עבור מצב שאין לו הודעה ספציפית יותר. ההקשר הסובב נוקב במה שגרם לה.
ראו גם#
warnings- הפרגמה שמפעילה, מתחמת, וממיינת לקטגוריות כל אזהרת W.$SIG{__WARN__}- יירוט אזהרות בזמן ריצה במקום לתת להן להגיע אלSTDERR.שגיאות הידור ביטוי רגולרי - דיאגנוסטיקות הביטוי הרגולרי הקטלניות, בניגוד לאלו ברמת האזהרה כאן.
Encode- שמות הקידודים שמאחורי האזהרה ”Cannot find encoding“.