Die my
macht eine lexikalische Variable. Es ist auf seinen Block oder, wenn nicht in einem Block, auf die Datei beschränkt. Sie können nicht außerhalb ihres Geltungsbereichs gesehen werden.
Sie könnten eine globale Variable erstellen, wie andere Antworten haben gezeigt:
our $var;
jedoch einen besseren Weg, andere Teile des Codes eine Schnittstelle zum Aktualisieren der lexikalische Version zu geben:
my $private;
sub set_private { $private = shift }
Wie auch immer, wenn Sie das tun, können Sie auch eine Schnittstelle haben, um den Wert zu erhalten. Nun, da Variable muss nur im gleichen Umfang wie die Subroutinen sein, die es verwenden, so können Sie es aus dem Rest der Datei verstecken:
{
my $private;
sub set_private { $private = shift }
sub get_private { $private }
}
jetzt Sie sind nur einen Schritt entfernt von einem Objekt (in Dieser Fall, ein Singleton):
use v5.12;
package Foo {
my $private;
sub new { bless \$private, shift }
sub set { my $self = shift; $$self = shift; }
sub get { my $self = shift; $$self; }
}
können Sie bitte erklären, warum downvote? –
Ich vermute nur, dass der Downvote daraus kommt, dass die Frage die Worte "richtigen Weg" verwendet, du hast ihm gerade gezeigt, wie Globals in Perl gemacht werden, wenn die FAQ-ish "richtige Antwort" zu 1) lexicals verwendet Wann immer möglich, 2) überprüfen und sehen, ob eine lexikalische * kann passen Sie Ihren Zweck, 3) Paket-Methoden verwenden, wie in Brians Antwort unten, 4) wenn Sie nicht andere tun können, legen Sie sie als * local * ein Bereich wie möglich. '{local $ PaketVar = -1; do_something_with_PackageVar(); } # out here $ PackageVar ist unset.' – Axeman
Auch vielleicht aus der Terminologie. "Lokale Variable" bedeutet etwas mit der "lokalen" Funktion zu tun. Lexikalische Variablen haben nichts mit "lokal" zu tun. –