2012-04-05 10 views
2

Ich habe den globalen folgende in Variable in file_1.pl, im Paket main:richtiger Weg ein Perl globalen Variable aktualisiert

package main; 

my $var = -1; 

Wenn ich diese Variable aus einer anderen Perl-Datei aktualisieren muß, was ist der Weg es zu tun? Ich habe versucht:

$main::var = 1 

Aber es hat nicht funktioniert.

Was ist der richtige Weg?

Vielen Dank!

Antwort

3

Sie haben die Variable mit our anders zu erklären, als lexikalischer Variable betrachtet würde es so ändern wie

our $var = -1; 
+0

können Sie bitte erklären, warum downvote? –

+2

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

+1

Auch vielleicht aus der Terminologie. "Lokale Variable" bedeutet etwas mit der "lokalen" Funktion zu tun. Lexikalische Variablen haben nichts mit "lokal" zu tun. –

1

Sie können eine Wrapper-Funktion erstellen.

In Hauptdatei

our $var; 
sub updateGlobal { 
    $var = shift; 
} 

In der anderen Datei aufrufen nur eine Funktion

updateGlobal(1); 
8

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; } 
    } 
+0

+1 für die detaillierte Antwort. – Izza

Verwandte Themen