מודולים

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, with unimport swapped in for import. 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 במקום import

  • require - שלב הטעינה בזמן ריצה ש־no מבצע לפני קריאה ל־unimport

  • package - מצהיר על החבילה הנוכחית, שהיא התחום ש־unimport של פרגמה בדרך כלל משנה

  • import - מתודת המקבילה המוסכמת; no קורא ל־unimport, use קורא ל־import

  • BEGIN - שלב ההידור שבו no רץ

  • caller - כיצד מתודת unimport מזהה את החבילה שעליה להשפיע