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