getnetent#
Διαβάζει την επόμενη εγγραφή από τη βάση δεδομένων δικτύων.
Η getnetent περιβάλλει την ομώνυμη ρουτίνα της βιβλιοθήκης C. Διατρέχει τη βάση δεδομένων δικτύων του συστήματος (συνήθως το /etc/networks, ενίοτε ενισχυμένη από NIS ή άλλα backend αναλυτών) μία εγγραφή τη φορά, επιστρέφοντας την επόμενη εγγραφή σε κάθε κλήση. Συνδυάστε την με την setnetent για επαναφορά ή έλεγχο της σύνδεσης, και με την endnetent για κλείσιμό της.
Σύνοψη#
my ($name, $aliases, $addrtype, $net) = getnetent;
my $name = getnetent; # scalar context
Τι επιστρέφεται#
Σε περιβάλλον λίστας, μια λίστα τεσσάρων στοιχείων:
$name- κανονικό όνομα δικτύου (π.χ."loopback").$aliases- συμβολοσειρά εναλλακτικών ονομάτων διαχωρισμένων με κενά.$addrtype- οικογένεια διευθύνσεων, τυπικάAF_INET(2).$net- αριθμός δικτύου ως ακέραιος σε σειρά bytes του υπολογιστή. Μετατροπή σε μορφή τελειών με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 - η διεπαφή ανά όνομα από την standard library αντικαθιστά τη λίστα επιστροφής κατά θέση με ένα 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. Στο Linux, η glibc παρέχει τη συνάρτηση αλλά η βάση είναι συχνά κενή - τα περισσότερα συστήματα βασίζονται σε DNS αντ’ αυτού, το οποίο αυτή η διεπαφή δεν συμβουλεύεται.Ασφάλεια νημάτων: ο επαναλήπτης της βιβλιοθήκης C δεν είναι ασφαλής για νήματα. Η Perl ενδέχεται να αντικαταστήσει διαφανώς με
getnetent_rσε συστήματα που την παρέχουν, αλλά μην υποθέσετε ότι αυτό είναι καθολικό. Σε πρόγραμμα με νήματα, σειριοποιήστε την πρόσβαση μέσω ενός μόνο νήματος.Tainting: όταν είναι ενεργοποιημένο το tainting, και τα τέσσερα πεδία επιστροφής είναι tainted - προέρχονται από αρχείο (ή απομακρυσμένο αναλυτή) εκτός του ελέγχου του προγράμματος.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
setnetent- επαναφέρει τον επαναλήπτη και προαιρετικά κρατά την υποκείμενη σύνδεση ανοιχτή σε όλες τις κλήσειςendnetent- κλείνει τον επαναλήπτη όταν τελειώσετεgetnetbyname- αναζήτηση ενός δικτύου με όνομα αντί για διάσχιση ολόκληρης της βάσηςgetnetbyaddr- αναζήτηση ενός δικτύου με τη διεύθυνσή τουgethostent- η ανάλογη διάσχιση της βάσης δεδομένων υπολογιστών, με το ίδιο συμπληρωματικό ζεύγοςset/endNet::netent- αντικειμενική διεπαφή ανά όνομα που αντικαθιστά τη λίστα επιστροφής κατά θέση