no#
ההופכי בזמן הידור של use - קורא למתודת unimport של מודול כדי לכבות מה ש־use הדליק.
no MODULE LIST מטופל על־ידי המפענח בדיוק כמו use MODULE LIST, פרט לכך שהוא קורא ל־MODULE->unimport(LIST) במקום ל־MODULE->import(LIST). שניהם רצים בזמן הידור, שניהם בעלי תיחום לקסיקלי, ושניהם דורשים שהמודול כבר יהיה טעון. המקרה השכיח הוא כיבוי פרגמה בתוך בלוק - no strict 'refs', no warnings 'uninitialized', no feature 'switch' - מבלי לגעת בקובץ העוטף.
תקציר#
no MODULE LIST
no MODULE
no MODULE VERSION LIST
no MODULE VERSION
מה מקבלים בחזרה#
no הוא הצהרה, לא ביטוי. אין לו ערך החזרה שימושי ולא ניתן שיופיע במקום שבו ערך מצופה. ההשפעה היא תופעת לוואי על מצב זמן ההידור של התחום הלקסיקלי העוטף.
כיצד הוא מתרחב#
המפענח כותב מחדש
no MODULE LIST;
לשקול המקורב של
BEGIN {
require MODULE;
MODULE->unimport(LIST);
}
the same shape as
use, withunimportswapped in forimport. Consequences that follow from this:זמן הידור. בלוק ה־
BEGINרץ ברגע שהמפענח מגיע להוראתno, לפני שכל קוד מאוחר יותר בקובץ מהודר. זו הסיבה ש־no strict 'refs'בעל תוקף על ההוראות העוקבות לו באותו קובץ, לא בזמן ריצה.תיחום לקסיקלי. פרגמות המכבדות תיחום לקסיקלי (
strict,warnings,feature,integer,utf8, ושאר הפרגמות הליבתיות) רואות את אפקט ה־״כיבוי״ שלהן מוגבל לבלוק העוטף הפנימי ביותר, ל־eval, או לקובץ. יציאה מהבלוק משחזרת את המצב הקודם.requireעדיין מתרחש.no MODULEטוען אתMODULEאם הוא טרם נטען, ואז קורא ל־unimportעליו. אינכם זקוקים ל־useתואם מוקדם יותר בקובץ.unimportהוא חובה. אם לחבילה אין מתודתunimport, הקריאה מתה בזמן הידור עםCan't locate object method "unimport" via package "MODULE". רוב המודולים שאינם פרגמות אינם מגדיריםunimport-noשימושי באמת רק עבור מודולים שמכריזים עליו.
דוגמאות#
כיבוי קטגוריית אזהרה יחידה בתוך בלוק:
use warnings;
for my $row (@rows) {
no warnings 'uninitialized';
print join(",", @$row), "\n"; # empty fields render as ""
}
# 'uninitialized' warnings are back on here
הקלת strict 'refs' להוראה אחת שזקוקה ל־dereferencing סימבולי:
use strict;
sub install {
my ($name, $code) = @_;
no strict 'refs';
*{"main::$name"} = $code; # symbolic typeglob assignment
}
השבתת אזהרת תכונה ניסיונית בעת השימוש בתכונה:
use feature 'signatures';
no warnings 'experimental::signatures';
sub greet ($who) { "hello, $who\n" }
גלגול לאחור של חבילת תכונות ברירת מחדל לסמנטיקת Perl פשוטה:
use v5.36; # enables strict, warnings, say, signatures…
no feature 'switch'; # …but not given/when
כיבוי פרגמת משתמש המספקת unimport משלה:
use My::Pragma qw(loud);
{
no My::Pragma; # My::Pragma->unimport called here
quiet_code();
}
מקרי קצה#
no VERSIONהוא שגיאת הידור.use VERSIONקיים כבדיקת גרסה בזמן הידור מול המפענח הרץ; אין הופכי הגיוני, ולכןno 5.36;מת עםNo such class 5.36. בדיקת הגרסה הולכת רק לכיוון אחד.no MODULE VERSIONכן מתפענח. הוא דורש ש־MODULEיהיה לפחותVERSION(אותה בדיקה כמוuse), ואז קורא ל־MODULE->unimport(LIST). בדיקת הגרסה היא על המודול הטעון, לא על המפענח.מודול ללא
unimport. מת בזמן הידור. אין נסיגה ל־no-op; אם אתם כותבים מודול ורוצים ש־noיהיה no-op שקט, הגדירוsub unimport {}ריק.bareword של
MODULEבלבד. כמוuse, שם המודול חייב להיות bareword הידוע בזמן הידור.no $name;הוא שגיאת תחביר - המפענח זקוק לטוקן הליטרלי כדי להחליט לאיזהunimportלקרוא.אינו מבטל את
use.no Fooקורא ל־Foo->unimport, אשר על־פי מוסכמה מבטל את מה ש־Foo->importעשה לתחום הלקסיקלי הנוכחי - אך זוהי מוסכמה, לא הבטחת שפה.unimportרשלני יכול להשאיר מצב מאחור, ותופעות לוואי מ־require Foo(בלוקי BEGIN, הווים של@INC, תת־שגרות מותקנות בחבילות אחרות) אינן מתגלגלות לאחור.ההשפעה נגמרת בבלוק העוטף. עבור פרגמות לקסיקליות, מצב ה־״כיבוי״ נעצר ב־
}הבא, בגבולeval, או בסוף הקובץ. קוד בקובץ אחר שעושהrequireאוuseלזה הנוכחי אינו מושפע.import/unimportהם רק קריאות מתודה.MODULE->unimport(LIST)רץ בדיוק כמו כל מתודת מחלקה אחרת - הוא רואה אתMODULEכארגומנט הראשון ואתLISTאחריו. המתודה יכולה לבחון את הקורא דרךcallerכדי לגלות באיזו חבילה לשנות.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
use- הצורה החיובית;noהוא ממשuseעםunimportבמקוםimportrequire- שלב הטעינה בזמן ריצה ש־noמבצע לפני קריאה ל־unimportpackage- מצהיר על החבילה הנוכחית, שהיא התחום ש־unimportשל פרגמה בדרך כלל משנהimport- מתודת המקבילה המוסכמת;noקורא ל־unimport,useקורא ל־importBEGIN- שלב ההידור שבוnoרץcaller- כיצד מתודתunimportמזהה את החבילה שעליה להשפיע