2010-11-03 17 views
7

Perl automatically initializes variables a undef per impostazione predefinita.Come posso inizializzare automaticamente tutte le variabili scalari in Perl?

C'è un modo per sovrascrivere questo comportamento predefinito e indicare all'interprete Perl di inizializzare le variabili su zero (o qualche altro valore fisso)?

+0

L'inizializzazione delle variabili su "undef" è ancora un'inizializzazione. – zigdon

+7

Posso chiedere _why_ che vorresti fare questo? – Zaid

+0

@Zaid: La storia completa - Sto leggendo il codice completo (che menziona sempre l'inizializzazione delle variabili durante la dichiarazione, se possibile) e guardavo uno dei miei vecchi file che utilizza molti contatori che avevo inizializzato tutti a "zero" inizialmente ma in seguito rimosse tutte le inizializzazioni non necessarie. Sto pensando di reintrodurre tutte le inizializzazioni e ho posto questa domanda per trovare un modo migliore per farlo. – Lazer

risposta

12

La raccomandazione in codice completo è importante per il linguaggio come C, perché quando si ha

int f(void) { 
    int counter; 
} 

il valore di counter è tutto ciò che accade di occupare quel ricordo.

In Perl, quando si dichiara una variabile utilizzando

my $counter; 

non v'è dubbio che il valore di $counter è undef non qualche spazzatura casuale.

Pertanto, la motivazione alla base della raccomandazione, vale a dire garantire che tutte le variabili inizino con valori noti, viene automaticamente soddisfatta in Perl e non è necessario fare nulla.

Quello che si fa con i contatori è di incrementarli o decrementarli. Il risultato di:

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

è ben definito in Perl. $counter manterrà il valore 1.

Infine, direi che, nella maggior parte dei casi, i contatori non sono necessari in Perl e il codice che fa ampio uso di variabili contatore potrebbe dover essere riscritto.

+2

+1 per l'annullamento con una spiegazione elegante – daxim

+2

Quando * riscritto * diventa * refactored *, comunque? ☺ – tchrist

5

No. Ciò potrebbe causare alcuni bug molto spaventosi e difficili da decifrare, quindi non è una buona idea cambiare comportamento in questo modo.

In Perl, è possibile dichiarare le variabili quando ne avete bisogno per la prima volta, quindi non è generalmente necessario dichiararle prima (con o senza inizializzazione) e quindi utilizzarle in un secondo momento. Inoltre, operatori come ++ lavorerà con valori non definiti altrettanto bene come zero, quindi non è necessario inizializzare i contatori a tutti:

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

Tuttavia, posso inserire una spina per Moose da ricordare che si può raggiungere inizializzazione automatica degli attributi nelle classi Moose:

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"; 

stampe:

stringa ha valore: valore iniziale
numero ha valore: 0

11

Per quanto ne so, questo non è possibile (e non dovrebbe essere, è ancora più pericoloso di $[).

È possibile inizializzare le variabili come segue per ridurre il boilerplate:

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

o spostare l'inizializzazione di una funzione:

sub zero {$_ = 0 for @_} 

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

o anche:

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

grazie. btw, come è '$ [' pericoloso? – Lazer

+1

è l'indice da cui partono gli array. era lì per far si che perl si comportasse come awk impostandolo su 1. è deprecato e avverte e ha solo scope di file e deve essere impostato in fase di compilazione a causa di tutti i bug che potrebbe causare in codice non correlato. perldoc perlvar per ulteriori informazioni –

+0

Impossibile capire perché è necessario inizializzare qualcosa a zero al suo punto di dichiarazione. – tchrist

0

Ti avere una ragione concreta per voler fare questo, o è semplicemente "perché Codice Comple te dice che dovrei "?

Se il primo, si prega di condividere la ragione e possiamo discutere correttamente modi Perly per realizzare il tuo vero obiettivo.

Se quest'ultimo, si ricorda che Codice completo è un insieme di linee guida per la programmazione in C, non in Perl. Perl non è C e ha il suo insieme di punti di forza e di debolezza, il che significa anche che ha un diverso insieme di ... e io odio usare questa frase ... le migliori pratiche. Le linee guida appropriate per una lingua non si applicano necessariamente all'altra. "Inizializza sempre le variabili (se possibile) quando le dichiari" è una buona pratica in C, ma generalmente non necessaria in Perl.

Problemi correlati