2010-11-03 7 views
7

Perl automatically initializes variables zu undef standardmäßig.Wie kann ich automatisch alle skalaren Variablen in Perl initialisieren?

Gibt es eine Möglichkeit, dieses Standardverhalten zu überschreiben und dem Perl-Interpreter mitzuteilen, Variablen auf zero (oder einen anderen festen Wert) zu initialisieren?

+0

Das Initialisieren von Variablen auf undef ist immer noch eine Initialisierung. – zigdon

+7

Darf ich fragen, warum Sie das tun möchten? – Zaid

+0

@Zaid: Die ganze Geschichte - Ich lese Code Complete (die erwähnt, immer Variablen während der Deklaration initialisiert, wenn möglich) und schaute auf eine meiner alten Dateien, die eine Menge von Zählern verwendet, die ich initialisiert hatte auf Null aber später entfernt alle unnötigen Initialisierungen. Ich denke darüber nach, alle Initialisierungen wieder einzuführen und stelle diese Frage, um einen besseren Weg zu finden, dies zu tun. – Lazer

Antwort

12

Die Empfehlung in Code Complete ist wichtig für die Sprache wie C, denn wenn man

int f(void) { 
    int counter; 
} 

der Wert counter haben ist, was auch immer, dass der Speicher zu besetzen geschieht.

In Perl, wenn Sie deklarieren eine Variable mit

my $counter; 

gibt es keinen Zweifel, dass der Wert von $counter ist undef nicht einige zufällige Müll.

Daher ist die Motivation hinter der Empfehlung, d. H. Sicherzustellen, dass alle Variablen mit bekannten Werten beginnen, in Perl automatisch erfüllt und es ist nicht notwendig, etwas zu tun.

Was Sie mit Zählern tun, ist, sie zu erhöhen oder zu verringern. Das Ergebnis von:

my $counter; 
# ... 
++ $counter; 

ist in Perl gut definiert. $counter enthält den Wert 1.

Schließlich würde ich argumentieren, dass in den meisten Fällen Zähler in Perl nicht erforderlich sind und Code, der ausgiebig Zählervariablen verwendet, möglicherweise neu geschrieben werden muss.

+2

+1 für das Löschen mit einer eleganten Erklärung – daxim

+2

Wann wurde * umgeschrieben * überhaupt * umgestaltet? ☺ – tchrist

5

Nein. Dies kann zu einigen sehr gruseligen und schwer zu entziffernden Fehlern führen, daher ist es keine gute Idee, das Verhalten auf diese Weise zu ändern.

In Perl können Sie Variablen genau dann deklarieren, wenn Sie sie zum ersten Mal benötigen. Daher müssen diese nicht zuerst deklariert werden (mit oder ohne Initialisierung) und dann später verwendet werden. Zusätzlich Betreiber wie ++ mit undefinierten Werten arbeiten gleich gut wie Null, so dass Sie nicht brauchen, um Zähler zu initialisieren überhaupt:

# this is perfectly legal: 
my $counter; 
while ($some_loop) 
{ 
    $counter++; 
} 

Allerdings habe ich einen Stecker für Moose durch die Erwähnung einfügen können, dass Sie erreichen können automatische Initialisierung von Attributen in Ihrem Moose Klassen:

package MyClass; 
use strict; 
use warnings; 
use Moose; 

has some_string => (
    is => 'rw', isa => 'Str', 
    default => 'initial value', 
); 

has some_number => (
    is => 'rw', isa => 'Int', 
    default => 0, 
); 
__PACKAGE__->meta->make_immutable; 
1; 

package main; 
my $object = MyClass->new; 
print "string has value: ", $object->some_string, "\n"; 
print "number has value: ", $object->some_number, "\n"; 

druckt:

String hat Wert: Anfangswert
Zahl hat einen Wert: 0

11

Soweit ich weiß, ist dies nicht möglich (und sollte nicht sein, es ist noch gefährlicher als).

Sie können Ihre Variablen initialisieren, wie auf Textvorschlag zur Senkung folgt:

my ($x, $y, $z) = (0) x 3; 

oder Initialisierung auf eine Funktion verschieben:

sub zero {$_ = 0 for @_} 

zero my ($x, $y, $z); 

oder sogar:

$_ = 0 for my ($x, $y, $z); 
+0

danke. BTW, wie ist '$ [' gefährlich? – Lazer

+1

ist der Index, von dem Arrays ausgehen. Es war da, um Perl wie awk zu verhalten, indem man es auf 1 setzt. Es ist veraltet und warnt und hat nur den Dateiumfang und muss zur Kompilierzeit gesetzt werden wegen aller Fehler, die es in nicht verwandtem Code verursachen könnte. perldoc perlvar für weitere Informationen –

+0

Kann nicht sehen, warum Sie etwas zu Null am Punkt der Deklaration initialisieren müssten. – tchrist

0

Sie tun einen konkreten Grund haben, dies zu tun, oder ist es einfach "weil Code Comple te sagt ich sollte "?

Wenn der ehemalige, teilen Sie bitte den Grund und wir können richtig diskutieren Möglichkeiten, um Ihr wirkliches Ziel zu erreichen.

Wenn letzteres, bitte denken Sie daran, dass Code Complete ist eine Reihe von Richtlinien für die Programmierung in C, nicht Perl. Perl ist nicht C und hat seine eigenen Stärken und Schwächen, was auch bedeutet, dass es eine andere Reihe von ... hat und ich hasse es, diese Phrase zu verwenden ... Best Practices. Richtlinien, die für eine Sprache angemessen sind, gelten nicht notwendigerweise für die jeweils andere Sprache. "Variablen immer initialisieren (wenn möglich), wenn Sie sie deklarieren" ist eine gute Übung in C, aber in Perl generell nicht notwendig.

Verwandte Themen