scalar#
Εξαναγκάζει την αποτίμηση της EXPR σε βαθμωτό περιβάλλον και επιστρέφει την τιμή της.
Η scalar δεν είναι στην πραγματικότητα τελεστής με δική της υπόσταση - είναι σημάδι εξαναγκασμού περιβάλλοντος που ο αναλυτής αναγνωρίζει μπροστά από μια μοναδιαία έκφραση. Η Perl αποτιμά την έκφραση σε βαθμωτό περιβάλλον και αποδίδει ό,τι παράγει αυτή η έκφραση εκεί. Η συνάρτηση υπάρχει επειδή οι περισσότερες θέσεις σε ένα πρόγραμμα Perl επιβάλλουν ήδη ένα περιβάλλον (λίστας ή βαθμωτό) στους τελεστές τους, και περιστασιακά χρειάζεται να παρακάμψετε το περιβάλλον λίστας με βαθμωτό περιβάλλον ρητά.
Σύνοψη#
scalar EXPR
scalar @array
scalar %hash
scalar localtime
Τι επιστρέφεται#
Η τιμή της EXPR όπως αποτιμάται σε βαθμωτό περιβάλλον. Το ακριβές σχήμα εξαρτάται εξ ολοκλήρου από το τι είναι η EXPR:
Για πίνακα, ο μετρητής στοιχείων.
Για πίνακα κατακερματισμού, αληθής τιμή (μη κενός) ή
0(κενός)· σε παλαιότερες Perl αυτή ήταν συμβολοσειρά χρήσης κάδων, αλλά από την 5.26 και μετά είναι ο μετρητής κλειδιών.Για συνάρτηση ευαίσθητη στο περιβάλλον λίστας, ό,τι επιστρέφει αυτή η συνάρτηση όταν καλείται σε βαθμωτό περιβάλλον (για παράδειγμα, η
localtimeεπιστρέφει τη συμβολοσειρά τύπου ctime αντί για τη λίστα εννέα στοιχείων).Για ήδη βαθμωτή έκφραση, η ίδια τιμή - η
scalarείναι no-op εκεί.
Καθολική κατάσταση που επηρεάζει#
Καμία. Η scalar είναι καθαρή μετατροπή περιβάλλοντος· δεν διαβάζει ούτε γράφει δικές της ειδικές μεταβλητές. Η έκφραση που περνάτε μπορεί φυσικά να αγγίζει όποιες καθολικές κανονικά αγγίζει.
Παραδείγματα#
Μέτρηση των στοιχείων ενός πίνακα μέσα σε θέση περιβάλλοντος λίστας:
my @items = (10, 20, 30);
my @counts = (scalar @items); # (3)
print scalar @items, "\n"; # 3
Χωρίς τη scalar, ο @items θα αναπτυσσόταν στα στοιχεία του και ο @counts θα ήταν (10, 20, 30).
Εκτυπώστε την αναγνώσιμη από άνθρωπο ημερομηνία από την localtime. Σε περιβάλλον λίστας η localtime επιστρέφει εννέα πεδία· σε βαθμωτό περιβάλλον επιστρέφει την οικεία συμβολοσειρά ctime:
print localtime, "\n"; # nine numbers run together
print scalar localtime, "\n"; # "Thu Apr 23 14:02:11 2026"
Η ίδια παγίδα εμφανίζεται οπουδήποτε μια ενσωματωμένη είναι ευαίσθητη στο περιβάλλον λίστας:
my @parts = localtime; # (sec, min, hour, mday, ...)
my $now = scalar localtime; # ctime string
Ελέγξτε αν ένας πίνακας κατακερματισμού είναι μη κενός χωρίς να κατανείμετε τη λίστα κλειδιών του:
if (scalar %config) {
# %config has at least one key
}
Το if (%config) επιβάλλει ήδη βαθμωτό (λογικό) περιβάλλον, οπότε η scalar εδώ είναι περιττή αλλά ρητή· οι συγγραφείς μερικές φορές την περιλαμβάνουν για να γίνει η πρόθεση ορατή στους αναγνώστες.
Δομήστε μια λίστα μετρητών από πολλούς πίνακες σε μία έκφραση:
my @counts = (scalar @a, scalar @b, scalar @c);
Εξαναγκάστε μια κλήση συνάρτησης που διαφορετικά θα «έσπαγε» σε περιβάλλουσα λίστα:
my @row = ($id, scalar get_tags($id), $mtime);
Χωρίς τη scalar, η get_tags θα έτρεχε σε περιβάλλον λίστας και η επιστρεφόμενη λίστα της θα ισοπεδωνόταν μέσα στον @row δίπλα στα $id και $mtime.
Οριακές περιπτώσεις#
Δεν υπάρχει αντίστροφος για περιβάλλον λίστας. Δεν υπάρχει τελεστής
list EXPR· το περιβάλλον λίστας είναι προεπιλεγμένο σχεδόν σε κάθε θέση όπου θα θέλατε να το επιβάλετε. Αν χρειάζεστε πραγματικά να εξαναγκάσετε μια βαθμωτή έκφραση σε περιβάλλον λίστας, το ιδίωμα είναι@{[ EXPR ]}, αν και στις περισσότερες περιπτώσεις αρκεί απλό(EXPR).Παγίδα παρενθετικής λίστας. Η
scalarείναι μοναδιαίος τελεστής. Το να της περάσετε μια παρενθετική έκφραση κόμματος δεν αποτιμά αυτή την έκφραση ως λίστα· την αποτιμά ως βαθμωτό τελεστή κόμματος, που εκτελεί κάθε υπο-έκφραση σε κενό περιβάλλον εκτός από την τελευταία και επιστρέφει την τελευταία σε βαθμωτό περιβάλλον:print uc(scalar(foo(), $bar)), $baz; # equivalent to: foo(); # void context print(uc($bar), $baz); # $bar in scalar context
Αν θέλατε να συμπεριληφθούν οι τιμές επιστροφής της
foo(), ηscalar (list)είναι το λάθος εργαλείο.Πίνακας κατακερματισμού σε βαθμωτό περιβάλλον. Από την Perl 5.26 και μετά, η
scalar %hεπιστρέφει τον αριθμό κλειδιών, όπως ηscalar keys %h. Σε παλαιότερες Perl επέστρεφε συμβολοσειρά όπως"4/8"που ανέφερε χρήση κάδων· η pperl στοχεύει την 5.42 και έτσι επιστρέφει πάντα τον μετρητή κλειδιών.Πρωτότυπα υπορουτινών. Μια υπορουτίνα που δηλώθηκε με βαθμωτό πρωτότυπο (
($)) επιβάλλει ήδη βαθμωτό περιβάλλον στο όρισμά της, οπότε ηscalarείναι περιττή μπροστά από την κλήση. Πρωτότυπο(@)ή(\@)δεν επιβάλλει, οπότε ηscalarεξακολουθεί να έχει σημασία:sub count ($) { $_[0] } count @items; # @items in scalar context: 3
Περιττή σε ήδη βαθμωτές εκφράσεις. Οι
scalar $x,scalar 42,scalar "text"είναι no-ops. Η Perl δεν προειδοποιεί για αυτές· χρησιμοποιούνται περιστασιακά για έμφαση αλλά δεν προσθέτουν τίποτα.Δεν είναι κλήση συνάρτησης. Επειδή η
scalarείναι σημάδι περιβάλλοντος σε επίπεδο αναλυτή, δεν μπορείτε να πάρετε\&scalar, δεν μπορείτε να την παρακάμψετε μεsub scalar { ... }, και δεν μπορείτε να την περάσετε ως αναφορά κώδικα.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
wantarray- επιθεωρήστε το περιβάλλον στο οποίο κληθήκατε, αντί να επιβάλετε ένα σε υπο-έκφρασηdefined- ομοίως μοναδιαίος τελεστής που εφαρμόζεται σε έκφραση· χρήσιμη παράλληλα με τηscalarόταν ελέγχετε αποτελέσματα συναρτήσεωνlocaltime- κανονικό παράδειγμα ενσωματωμένης της οποίας το σχήμα επιστροφής εξαρτάται από το περιβάλλονreverse- επίσης ευαίσθητη στο περιβάλλον· ηscalar reverse $sαντιστρέφει χαρακτήρες, ηreverse @aαντιστρέφει λίσταkeys- ηscalar keys %hείναι η εκτεταμένη μορφή τηςscalar %hμε το ίδιο αποτέλεσμα στην 5.26+