Εύρεση του μεγέθους ενός πίνακα σε Perl

Φαίνεται ότι έχω συναντήσει πολλούς διαφορετικούς τρόπους για να βρω το μέγεθος ενός πίνακα. Ποια είναι η διαφορά μεταξύ αυτών των τριών μεθόδων;

my @arr = (2);
print scalar @arr; # First way to print array size

print $#arr; # Second way to print array size

my $arrSize = @arr;
print $arrSize; # Third way to print array size
Λύση

Ο πρώτος και ο τρίτος τρόπος είναι ο ίδιος: αξιολογούν έναν πίνακα σε κλιμακωτό πλαίσιο. Θα θεωρούσα ότι αυτός είναι ο τυπικός τρόπος για να λάβετε το μέγεθος ενός πίνακα.

Ο δεύτερος τρόπος επιστρέφει στην πραγματικότητα τον τελευταίο δείκτη του πίνακα, ο οποίος δεν είναι (συνήθως) ο ίδιος με το μέγεθος του πίνακα.

Σχόλια (8)

Πρώτον, το δεύτερο δεν είναι ισοδύναμο με τα άλλα δύο. Το $#array επιστρέφει τον τελευταίο δείκτη του πίνακα, ο οποίος είναι ένας μικρότερος από το μέγεθος του πίνακα.

Οι άλλες δύο είναι ουσιαστικά οι ίδιες. Απλώς χρησιμοποιείτε δύο διαφορετικά μέσα για να δημιουργήσετε κλιμακωτό πλαίσιο. Καταλήγει σε ένα ζήτημα αναγνωσιμότητας.

Προσωπικά προτιμώ το εξής:

say 0+@array;          # Represent @array as a number

Το βρίσκω πιο ξεκάθαρο από το

say scalar(@array);    # Represent @array as a scalar

και

my $size = @array;
say $size;

Η τελευταία φαίνεται αρκετά σαφής μόνη της, αλλά βρίσκω ότι η επιπλέον γραμμή αφαιρεί τη σαφήνεια όταν είναι μέρος άλλου κώδικα. Είναι χρήσιμο για να διδάξετε τι κάνει το @array σε κλιμακωτό πλαίσιο, και ίσως αν θέλετε να χρησιμοποιήσετε το $size περισσότερες από μία φορές.

Σχόλια (13)

Αυτό παίρνει το μέγεθος εξαναγκάζοντας τον πίνακα σε ένα κλιμακωτό πλαίσιο, στο οποίο αξιολογείται ως το μέγεθός του:

print scalar @arr;

Αυτός είναι ένας άλλος τρόπος να εξαναγκάσετε τον πίνακα σε ένα κλιμακωτό πλαίσιο, αφού ανατίθεται σε μια κλιμακωτή μεταβλητή:

my $arrSize = @arr;

Αυτό παίρνει το δείκτη του τελευταίου στοιχείου του πίνακα, οπότε'είναι στην πραγματικότητα το μέγεθος μείον 1 (υποθέτοντας ότι οι δείκτες ξεκινούν από το 0, το οποίο είναι ρυθμιζόμενο στην Perl, αν και αυτό είναι συνήθως κακή ιδέα):

print $#arr;

Αυτό το τελευταίο δεν είναι'πραγματικά καλό να χρησιμοποιηθεί για να πάρει το μέγεθος του πίνακα. Θα ήταν χρήσιμο αν θέλετε απλώς να πάρετε το τελευταίο στοιχείο του πίνακα:

my $lastElement = $arr[$#arr];

Επίσης, όπως μπορείτε να δείτε εδώ στο Stack Overflow, αυτή η κατασκευή δεν αντιμετωπίζεται σωστά από τους περισσότερους syntax highlighters...

Σχόλια (2)