Il comportamento di my
è documentato in perlsub
- si riduce a questo - perl
sa $string
è portata - perché il my
dice così.
Il mio operatore dichiara le variabili elencate da lessicalmente confinati al blocco racchiude, condizionale (se/meno/elsif/altro), loop (per/foreach/mentre/fino a/continua), subroutine, eval, o do/require/use'd file.
Significa che è "in ambito" dal punto in cui è "visto" prima della parentesi di chiusura del "blocco" corrente. (O nel tuo esempio - la fine del codice)
Tuttavia - nell'esempio my
anche assegna un valore.
Questo processo di scoping avviene in fase di compilazione - dove perl controlla dove è valido utilizzare $string
oppure no. (Grazie a strict
). Tuttavia, non può sapere quale fosse il valore, poiché ciò potrebbe cambiare durante l'esecuzione del codice. (E non è banale per analizzare)
Quindi, se si esegue questa operazione potrebbe essere un po 'più chiaro quello che sta succedendo:
#!/usr/bin/env perl
use strict;
use warnings;
my $string; #undefined
func();
$string = 'string';
func();
sub func {
print $string, "\n";
}
$string
è portata in entrambi i casi - perché il my
accaduto al momento della compilazione - prima che la subroutine sia stata chiamata - ma non ha un valore impostato oltre il valore predefinito di undef
prima della prima chiamata.
Nota questo contrasta con:
#!/usr/bin/env perl
use strict;
use warnings;
sub func {
print $string, "\n";
}
my $string; #undefined
func();
$string = 'string';
func();
Quali errori perché quando il sub è dichiarata, $string
non è nel campo di applicazione.
* Sempre * 'usare rigorosamente; usa gli avvertimenti; '! – Biffen
Oh ya In realtà ho questi pragmi nel mio file di test. Lo modifico Grazie. – darkgrin