אזהרות#

דיאגנוסטיקות לא־קטלניות. אזהרה מדפיסה שורה אחת אל 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“.