our#
Δηλώνει ένα λεξιλογικά οριοθετημένο ψευδώνυμο σε μια μεταβλητή πακέτου.
Η our δεν δημιουργεί νέα μεταβλητή. Εισάγει στην τρέχουσα λεξιλογική εμβέλεια ένα όνομα που παραπέμπει στη μεταβλητή πακέτου με το ίδιο όνομα στο τρέχον πακέτο. Καθ” όλη τη διάρκεια αυτής της εμβέλειας, το μη ειδικευμένο όνομα είναι νόμιμο υπό το use strict 'vars', και κάθε ανάγνωση ή εγγραφή μέσω αυτού πηγαίνει στην υποκείμενη μεταβλητή πακέτου.
Αν η μεταβλητή πακέτου δεν υπήρχε ακόμη, η our ούτε αυτή την επικαλείται - απλώς της δίνει όνομα. Οι μεταβλητές πακέτου έρχονται στην ύπαρξη όταν τους ανατεθεί τιμή για πρώτη φορά, και μια δήλωση our καθιστά αυτήν την πρώτη ανάθεση δυνατή χωρίς πλήρως ειδικευμένο όνομα.
Σύνοψη#
our $x;
our ($a, $b, $c);
our @EXPORT_OK = qw(foo bar);
our $VERSION : shared = '1.00';
Τι επιστρέφεται#
Η our επιστρέφει τη λίστα των μεταβλητών της, οπότε μπορεί να εμφανιστεί σε οποιαδήποτε θέση έκφρασης μπορεί να εμφανιστεί η my:
(our $x, our $y) = (1, 2);
our $count = 0;
Ως δήλωση δεν έχει χωριστή τιμή επιστροφής πέραν αυτής - το χρήσιμο αποτέλεσμα είναι η παρενέργεια εμβέλειας, όχι η τιμή.
Εμβέλεια και τι ακριβώς είναι το ψευδώνυμο#
Το ψευδώνυμο ζει στο περικλείον λεξιλογικό μπλοκ, ακριβώς όπως οι my και state. Τερματίζει στο άγκιστρο κλεισίματος αυτού του μπλοκ (ή στο τέλος του αρχείου για δήλωση ανώτατου επιπέδου). Έξω από την εμβέλεια, το μη ειδικευμένο όνομα δεν είναι πλέον νόμιμο υπό το use strict 'vars' - η ίδια η μεταβλητή πακέτου παραμένει ανέπαφη και εξακολουθεί να είναι προσπελάσιμη με το πλήρως ειδικευμένο όνομά της.
package Foo;
use strict;
$Foo::foo = 23;
{
our $foo; # alias to $Foo::foo
print $foo; # 23
}
print $Foo::foo; # 23 - the package variable is unaffected
print $foo; # error: requires explicit package name
Επειδή η our αποτελεί ψευδώνυμο σε μεταβλητή πακέτου, το πακέτο καθορίζεται στο σημείο της δήλωσης, όχι στο σημείο της χρήσης. Η αλλαγή πακέτου με package στο μέσο της εμβέλειας δεν επανασυνδέει το ψευδώνυμο:
package Foo;
our $bar; # declares $Foo::bar for the rest of this scope
$bar = 20;
package Bar;
print $bar; # 20 - still refers to $Foo::bar
our έναντι my#
Η our και η my μοιάζουν στο χαρτί και συχνά συγχέονται. Κάνουν αντίθετα πράγματα.
Η
myδημιουργεί μια φρέσκια ιδιωτική μεταβλητή που ζει μόνο μέσα στη λεξιλογική εμβέλειά της. Δεν έχει όνομα στον πίνακα συμβόλων κανενός πακέτου και τίποτε έξω από την εμβέλεια δεν μπορεί να την προσπελάσει.Η
ourδημιουργεί ένα λεξιλογικά οριοθετημένο ψευδώνυμο σε μια δημόσια μεταβλητή πακέτου. Η μεταβλητή ζει στον πίνακα συμβόλων· οποιοσδήποτε άλλος κώδικας γνωρίζει το πλήρως ειδικευμένο όνομά της μπορεί να τη διαβάσει ή να τη γράψει.
Χρησιμοποιήστε my ως προεπιλογή. Καταφύγετε στην our όταν θέλετε σκόπιμα καθολική κατάσταση πακέτου: λίστες exporter αρθρώματος (our @EXPORT, our @EXPORT_OK), our $VERSION, ένα hash διαμόρφωσης σε επίπεδο πακέτου που άλλος κώδικας αναμένεται να πειράξει, ή το παραδοσιακό our @ISA για κληρονομικότητα.
package My::Module;
our $VERSION = '1.23';
our @EXPORT_OK = qw(frobnicate);
our @ISA = ('Exporter');
Κάθε ένα από αυτά τα ονόματα είναι ψευδώνυμο στα $My::Module::VERSION, @My::Module::EXPORT_OK, @My::Module::ISA - ακριβώς αυτό που αναζητούν τα Exporter και UNIVERSAL::isa.
our έναντι local#
Η local και η our συχνά εμφανίζονται μαζί και είναι συμπληρωματικές, όχι εναλλακτικές.
Η
ourκάνει τη μεταβλητή πακέτου προσπελάσιμη με το μη ειδικευμένο όνομά της εντός λεξιλογικής εμβέλειας. Δεν αποθηκεύει ούτε επαναφέρει την τιμή.Η
localαποθηκεύει την τρέχουσα τιμή μιας μεταβλητής πακέτου και φροντίζει να επαναφερθεί όταν τερματίσει η περικλείουσα δυναμική εμβέλεια. Δεν καθιστά το όνομα νόμιμο υπό τοuse strict 'vars'.
Το ιδιωματικό ζευγάρωμα - προσωρινή αλλαγή μιας καθολικής πακέτου μέσα σε υπορουτίνα - χρησιμοποιεί και τις δύο:
sub with_verbose {
our $verbose; # make the unqualified name legal here
local $verbose = 1; # save old value, restore on return
do_work();
}
our έναντι state#
Η state είναι η άλλη λεξιλογική δήλωση. Δημιουργεί μια ιδιωτική μεταβλητή της οποίας η τιμή διατηρείται μεταξύ κλήσεων στην περικλείουσα υπορουτίνα. Η our δεν μοιράζεται τίποτα από αυτόν τον μηχανισμό - η μεταβλητή της είναι δημόσια και δεν έχει σημασιολογία ανά κλήση. Επιλέξτε state για memoisation ανά υπορουτίνα, our για καθολική κατάσταση πακέτου.
Η εμβέλεια της ίδιας της δήλωσης#
Όπως οι my, state και local, η our μπορεί να εμφανιστεί οπουδήποτε μπορεί μια έκφραση (έξω από παρεμβολή σε συμβολοσειρά). Η δήλωση τίθεται σε ισχύ άμεσα - ακόμη και μέσα στην ίδια εντολή - οπότε η μεταβλητή ικανοποιεί το use strict 'vars' από τη δήλωση και έπειτα. Αλλά η δήλωση δεν καλύπτει αναδρομικά προηγούμενες χρήσεις του ίδιου ονόματος στην ίδια εντολή:
package main;
my $x = 2;
foo($x, our $x = $x + 1, $x); # foo() receives (2, 3, 2)
foo($x, our $z = 5, $z); # foo() receives (3, 5, 5)
Ο κανόνας: κάθε εμφάνιση του ονόματος επιλύεται με βάση τη δική της θέση στην εντολή. Μετά τη δήλωση, το όνομα είναι το ψευδώνυμο· πριν από αυτή, το όνομα σημαίνει ό,τι σήμαινε προηγουμένως.
Η δήλωση επίσης σας επιτρέπει να αναφερθείτε στη μεταβλητή πακέτου στη δεξιά πλευρά του ίδιου του αρχικοποιητή της, κάτι που η my δεν επιτρέπει:
my $foo = $foo; # error under strict: undeclared $foo on RHS
our $foo = $foo; # fine: RHS $foo is the package variable
Πολλαπλές μεταβλητές και placeholders#
Περισσότερες από μία μεταβλητές απαιτούν παρενθέσεις:
our ($bar, $baz);
Μέσα σε λίστα με παρενθέσεις, το undef είναι έγκυρο placeholder που απορρίπτει την αντίστοιχη τιμή μιας ανάθεσης λίστας:
our ( undef, $min, $hour ) = localtime;
Επαναλαμβανόμενες δηλώσεις#
Πολλαπλές δηλώσεις our με το ίδιο όνομα στην ίδια λεξιλογική εμβέλεια επιτρέπονται όταν βρίσκονται σε διαφορετικά πακέτα - κάθε μία επανασυνδέει το ψευδώνυμο στη μεταβλητή του δικού της πακέτου:
use warnings;
package Foo;
our $bar; # declares $Foo::bar for the rest of this scope
$bar = 20;
package Bar;
our $bar = 30; # declares $Bar::bar - aliases the Bar variable
print $bar; # 30
Μια δεύτερη δήλωση our για το ίδιο όνομα στο ίδιο πακέτο και την ίδια εμβέλεια είναι απλώς πλεοναστική - επανασυνδέει στην ίδια μεταβλητή. Υπό το use warnings η Perl την αναφέρει με τον τρόπο που αναφέρει επαναλαμβανόμενη my, αλλά δεν υπάρχει φρέσκια μεταβλητή και τίποτα δεν επισκιάζεται:
use warnings;
package Bar;
our $bar = 30;
our $bar; # warning, but still the same $Bar::bar
print $bar; # 30
Χαρακτηριστικά και TYPE#
Η our δέχεται την πλήρη συντακτική μορφή δήλωσης της my:
our $x : shared;
our MyType $obj;
our $VERSION : shared = '1.00';
Το TYPE είναι αυτή τη στιγμή συνδεδεμένο με την pragma fields. Τα χαρακτηριστικά επεξεργάζονται από την pragma attributes (και, από την 5.8.0, από το Attribute::Handlers). Δείτε την pragma attributes για το σύνολο των τυπικών χαρακτηριστικών. Ο συνηθισμένος κώδικας επιπέδου χρήστη σπάνια χρησιμοποιεί κάποιο από τα δύο.
Παραδείγματα#
Πρόλογος αρθρώματος - η πιο συχνή κατά κράτος χρήση:
package My::Thing;
use strict;
use warnings;
our $VERSION = '0.01';
our @ISA = ('Exporter');
our @EXPORT_OK = qw(thingify);
Δήλωση και ανάθεση σε ένα βήμα:
package Cfg;
our $timeout = 30; # same as $Cfg::timeout = 30
Προσωρινή υπερκάλυψη μιας καθολικής πακέτου μέσα σε μια κλήση:
sub quiet_run {
our $verbose;
local $verbose = 0;
run_one_job();
}
Ψευδώνυμο μεταξύ πακέτων - δήλωση στο Foo, χρήση στο Bar:
package Foo;
our $shared = 'hello';
package Bar;
# $shared here still refers to $Foo::shared, because the lexical
# alias was introduced while the current package was Foo.
print $shared; # hello
Λίστα με παρενθέσεις και placeholder:
our ( undef, $min, $hour, undef, $mon, $year ) = localtime;
Οριακές περιπτώσεις#
Η
ourδεν δημιουργεί τη μεταβλητή. Δηλώνει ψευδώνυμο. Η μεταβλητή πακέτου υπάρχει τη στιγμή που οτιδήποτε της αναθέτει τιμή (ή λαμβάνει αναφορά σε αυτήν)· από μόνο του τοour $x;δεν εκχωρεί νέα θέση στον πίνακα συμβόλων.Το ψευδώνυμο είναι λεξιλογικό, η μεταβλητή δεν είναι. Η έξοδος από την εμβέλεια της
ourτερματίζει το ψευδώνυμο, όχι τη μεταβλητή. Μια άλλη εμβέλεια σε άλλο αρχείο που δηλώνειour $x;στο ίδιο πακέτο βλέπει τον ίδιο αποθηκευτικό χώρο.Επίλυση στην ίδια εντολή. Μόνο οι εμφανίσεις του ονόματος μετά τη δήλωση
ourσε μια εντολή χρησιμοποιούν το ψευδώνυμο. Οι προηγούμενες εμφανίσεις διατηρούν την προηγούμενη σύνδεσή τους (δείτε το παράδειγμαfoo()παραπάνω).Πακέτο, όχι τρέχον πακέτο κατά τη χρήση. Το ψευδώνυμο είναι συνδεδεμένο με το πακέτο που ισχύει στο σημείο της δήλωσης. Η αλλαγή πακέτου αργότερα δεν το ανακατευθύνει.
Δεν είναι το ίδιο με το
use vars. Τοuse vars '$x'καθιστά το$xνόμιμο υπό τοstrictγια το υπόλοιπο του πακέτου, ανεξάρτητα από εμβέλεια. Τοour $xείναι λεξιλογικό. Προτιμήστεour· τοuse varsείναι παλαιό.Δεν είναι pragma εμβέλειας αρχείου. Ένα
our $x;ανώτατου επιπέδου σε αρχείο καλύπτει μέχρι το τέλος του αρχείου, που είναι λεξιλογική εμβέλεια - αλλά τοrequireσε αυτό το αρχείο από αλλού δεν επεκτείνει το ψευδώνυμο στην εμβέλεια του αρχείου που κάνει το require.Η σημασιολογία των χαρακτηριστικών και του
TYPEεξακολουθεί να εξελίσσεται. Οτιδήποτε πέρα από το: sharedσε κώδικα χρήστη είναι σπάνιο· διαβάστε την τεκμηρίωση των pragmasattributesκαιfieldsπριν βασιστείτε σε αυτά.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
my- δηλώνει μια ιδιωτική λεξιλογική μεταβλητή· η προεπιλεγμένη επιλογή όταν θέλετε νέα μεταβλητήlocal- οριοθετεί δυναμικά μια προσωρινή τιμή για μεταβλητή πακέτου· συνδυάζεται με τηνourόταν χρειάζεστε ταυτόχρονα νομιμότητα υπό strict και αποθήκευση/επαναφοράstate- δηλώνει ιδιωτική λεξιλογική μεταβλητή που διατηρείται μεταξύ κλήσεων στην περικλείουσα υπορουτίναpackage- θέτει το τρέχον πακέτο, στο οποίο και αποτελεί ψευδώνυμο ηouruse- φορτωτής αρθρωμάτων κατά τη μεταγλώττιση· τοuse strict 'vars'είναι η pragma που καθιστά εξαρχής αναγκαία τηνourundef- έγκυρο placeholder μέσα σε λίσταourσε παρενθέσεις για απόρριψη μιας τιμής κατά την ανάθεση