206 Stimmen

Was ist der Unterschied zwischen "my" und "our" in Perl?

Ich weiß, was my ist in Perl. Sie definiert eine Variable, die nur in dem Bereich des Blocks existiert, in dem sie definiert ist. Was bedeutet our tun?

Wie funktioniert our abweichen von my ?

-1voto

Evgeniy Punkte 1

Überlegen wir einmal, was ein Interpreter eigentlich ist: Er ist ein Stück Code, das Werte im Speicher speichert und den Anweisungen in einem Programm, das er interpretiert, den Zugriff auf diese Werte über ihre Namen ermöglicht, die in diesen Anweisungen angegeben sind. Die Hauptaufgabe eines Interpreters besteht also darin, die Regeln zu formulieren, wie wir die Namen in diesen Anweisungen verwenden sollten, um auf die Werte zuzugreifen, die der Interpreter speichert.

Wenn der Interpreter auf "my" stößt, erzeugt er eine lexikalische Variable: einen benannten Wert, auf den der Interpreter nur während der Ausführung eines Blocks und nur innerhalb dieses syntaktischen Blocks zugreifen kann. Wenn der Interpreter auf "our" stößt, erzeugt er einen lexikalischen Alias einer Paketvariablen: Er bindet einen Namen, den der Interpreter von nun an bis zum Ende des Blocks als lexikalischen Variablennamen verarbeiten soll, an den Wert der Paketvariablen mit demselben Namen.

Der Effekt ist, dass Sie dann so tun können, als ob Sie eine lexikalische Variable verwenden und die Regeln von "use strict" zur vollständigen Qualifizierung von Paketvariablen umgehen. Da der Interpreter automatisch Paketvariablen anlegt, wenn sie zum ersten Mal verwendet werden, kann der Nebeneffekt der Verwendung von "our" auch sein, dass der Interpreter ebenfalls eine Paketvariable anlegt. In diesem Fall werden zwei Dinge erzeugt: eine Paketvariable, auf die der Interpreter von überall her zugreifen kann, vorausgesetzt, sie ist ordnungsgemäß gekennzeichnet, wie von "use strict" gefordert (mit dem Namen des Pakets und zwei Doppelpunkten vorangestellt), seinen lexikalischen Alias.

Quellen:

-2voto

xoid Punkte 1014
#!/usr/bin/perl -l

use strict;

# if string below commented out, prints 'lol' , if the string enabled, prints 'eeeeeeeee'
#my $lol = 'eeeeeeeeeee' ;
# no errors or warnings at any case, despite of 'strict'

our $lol = eval {$lol} || 'lol' ;

print $lol;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X