getnetent#
קורא את הערך הבא ממסד נתוני הרשתות.
getnetent עוטף את שגרת ספריית C בעלת אותו שם. הוא עובר על מסד הרשתות של המערכת (בדרך כלל /etc/networks, לעיתים מועשר על־ידי NIS או backends של resolver אחרים) רשומה אחת בכל פעם, מחזיר את הערך הבא בכל קריאה. שלב אותו עם setnetent כדי להחזיר לאחור או לשלוט בחיבור, ועם endnetent כדי לסגור אותו.
תקציר#
my ($name, $aliases, $addrtype, $net) = getnetent;
my $name = getnetent; # scalar context
מה מקבלים בחזרה#
בהקשר רשימה, רשימה בת ארבעה אלמנטים:
$name- שם הרשת הקנוני (למשל"loopback").$aliases- מחרוזת של שמות חלופיים מופרדת ברווחים.$addrtype- משפחת כתובות, בדרך כללAF_INET(2).$net- מספר הרשת כמספר שלם בסדר בתים של מארח. המר לצורה מנוקדת באמצעותSocket::inet_ntoa(pack("N", $net)).
בהקשר סקלר, רק $name.
כאשר האיטרטור ממוצה (אין עוד רשומות), הקשר רשימה מחזיר את הרשימה הריקה והקשר סקלר מחזיר undef. ערך חסר במהלך חיפוש ישיר מחזיר ערך אמת חסר־משמעות יחיד לפי מוסכמת perlfunc, אך מאחר ש־getnetent אינו לוקח מפתח, התנאי הסופי היחיד הוא ״סוף מסד הנתונים״.
מצב גלובלי שהוא נוגע בו#
getnetent קורא מ־איטרטור פר־תהליך המנוהל על־ידי ספריית C. כל קריאה מקדמת את האיטרטור הזה; אין מצב פר־תחום, ואיטרציה בו־זמנית משני מקומות באותו תהליך תשלב רשומות. setnetent מחזיר אותו לאחור ואופציונלית מבקש מהספרייה לשמור על החיבור המגבה פתוח לאורך האיטרציה; endnetent סוגר אותו.
דוגמאות#
עבור על כל מסד הרשתות:
setnetent(1);
while (my ($name, $aliases, $addrtype, $net) = getnetent) {
printf "%-20s %s\n", $name, join(" ", split / /, $aliases);
}
endnetent();
הקשר סקלר נותן רק את השם - שימושי לאיתור מהיר:
setnetent(1);
while (defined(my $name = getnetent)) {
print "$name\n";
}
endnetent();
פענח את מספר הרשת לצורה מנוקדת:
use Socket;
setnetent(1);
while (my ($name, undef, undef, $net) = getnetent) {
printf "%-20s %s\n", $name, inet_ntoa(pack "N", $net);
}
endnetent();
גישה מונחית עצמים דרך Net::netent - הממשק by-name מהספרייה הסטנדרטית מחליף את רשימת ההחזרה המיקומית באובייקט blessed:
use Net::netent;
while (my $n = getnetent()) {
printf "%s => %d\n", $n->name, $n->net;
}
מקרי קצה#
מיצוי איטרטור: הקשר רשימה מחזיר
(), הקשר סקלר מחזירundef. צורות הלולאה לעיל מסתיימות באופן טבעי.אין
setnetentלפני הלולאה: הקריאה הראשונה פותחת במשתמע את מסד הנתונים. עדיין מומלץ לקרוא ל־setnetent(1)- ללא הדגל ״הישאר פתוח״, חלק מספריות C פותחות מחדש את הקובץ בכל רשומה והביצועים קורסים.מעברים בו־זמניים מרובים: האיטרטור הוא גלובלי לתהליך. שתי לולאות מעל
getnetentבאותו תהליך יחלקו את הרשומות ביניהן. אסוף למערך תחילה אם שתיהן צריכות את הקבוצה המלאה.לא נתמך בחלק מהפלטפורמות: ל־Windows אין מקבילה ל־
/etc/networksושגרת C שמתחת חסרה. ניסיון לקרוא ל־getnetentשם מעלהThe getnetent function is unimplemented. בלינוקס, glibc מספקת את הפונקציה אך מסד הנתונים לעיתים קרובות ריק - רוב המערכות מסתמכות על DNS במקום, שממשק זה אינו פונה אליו.בטיחות thread: האיטרטור של ספריית C אינו בטוח־thread. Perl עשוי להחליף בשקיפות ל־
getnetent_rבמערכות שמספקות אותו, אך אל תניח שזה אוניברסלי. בתוכנית עם threads, סדר את הגישה דרך thread יחיד.Tainting: כאשר tainting מופעל, כל ארבעת שדות ההחזרה מסומנים - הם מגיעים מקובץ (או resolver מרוחק) מחוץ לשליטת התוכנית.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
setnetent- החזר את האיטרטור לאחור ואופציונלית שמור על החיבור המגבה פתוח על פני קריאותendnetent- סגור את האיטרטור כשסיימתgetnetbyname- חפש רשת אחת לפי שם במקום לעבור על כל מסד הנתוניםgetnetbyaddr- חפש רשת אחת לפי כתובתהgethostent- המעבר האנלוגי על מסד המארחים, עם אותו זוג נלווהset/endNet::netent- ממשק אובייקט by-name המחליף את רשימת ההחזרה המיקומית