Φαίνεται ότι έχω συναντήσει πολλούς διαφορετικούς τρόπους για να βρω το μέγεθος ενός πίνακα. Ποια είναι η διαφορά μεταξύ αυτών των τριών μεθόδων;
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
Ο πρώτος και ο τρίτος τρόπος είναι ο ίδιος: αξιολογούν έναν πίνακα σε κλιμακωτό πλαίσιο. Θα θεωρούσα ότι αυτός είναι ο τυπικός τρόπος για να λάβετε το μέγεθος ενός πίνακα.
Ο δεύτερος τρόπος επιστρέφει στην πραγματικότητα τον τελευταίο δείκτη του πίνακα, ο οποίος δεν είναι (συνήθως) ο ίδιος με το μέγεθος του πίνακα.
Πρώτον, το δεύτερο δεν είναι ισοδύναμο με τα άλλα δύο. Το $#array
επιστρέφει τον τελευταίο δείκτη του πίνακα, ο οποίος είναι ένας μικρότερος από το μέγεθος του πίνακα.
Οι άλλες δύο είναι ουσιαστικά οι ίδιες. Απλώς χρησιμοποιείτε δύο διαφορετικά μέσα για να δημιουργήσετε κλιμακωτό πλαίσιο. Καταλήγει σε ένα ζήτημα αναγνωσιμότητας.
Προσωπικά προτιμώ το εξής:
say 0+@array; # Represent @array as a number
Το βρίσκω πιο ξεκάθαρο από το
say scalar(@array); # Represent @array as a scalar
και
my $size = @array;
say $size;
Η τελευταία φαίνεται αρκετά σαφής μόνη της, αλλά βρίσκω ότι η επιπλέον γραμμή αφαιρεί τη σαφήνεια όταν είναι μέρος άλλου κώδικα. Είναι χρήσιμο για να διδάξετε τι κάνει το @array
σε κλιμακωτό πλαίσιο, και ίσως αν θέλετε να χρησιμοποιήσετε το $size
περισσότερες από μία φορές.
Αυτό παίρνει το μέγεθος εξαναγκάζοντας τον πίνακα σε ένα κλιμακωτό πλαίσιο, στο οποίο αξιολογείται ως το μέγεθός του:
print scalar @arr;
Αυτός είναι ένας άλλος τρόπος να εξαναγκάσετε τον πίνακα σε ένα κλιμακωτό πλαίσιο, αφού ανατίθεται σε μια κλιμακωτή μεταβλητή:
my $arrSize = @arr;
Αυτό παίρνει το δείκτη του τελευταίου στοιχείου του πίνακα, οπότε'είναι στην πραγματικότητα το μέγεθος μείον 1 (υποθέτοντας ότι οι δείκτες ξεκινούν από το 0, το οποίο είναι ρυθμιζόμενο στην Perl, αν και αυτό είναι συνήθως κακή ιδέα):
print $#arr;
Αυτό το τελευταίο δεν είναι'πραγματικά καλό να χρησιμοποιηθεί για να πάρει το μέγεθος του πίνακα. Θα ήταν χρήσιμο αν θέλετε απλώς να πάρετε το τελευταίο στοιχείο του πίνακα:
my $lastElement = $arr[$#arr];
Επίσης, όπως μπορείτε να δείτε εδώ στο Stack Overflow, αυτή η κατασκευή δεν αντιμετωπίζεται σωστά από τους περισσότερους syntax highlighters...