2012-12-17 8 views
6

Ho trovato questa linea molte volte nei moduli perl, ma non sono riuscito a capire cosa significasse esattamente.

my ($self, %myInputs) = @_; 

Gentilmente mi spiegano l'istruzione in modo che io possa procedere.

risposta

8

Suppongo che sia una delle prime linee in una funzione del metodo di classe . Quella linea analizza @_ che è la list of the function arguements, e estrae il primo parametro che è sempre un riferimento all'oggetto in $self ed estrae il resto di loro in un hash%myInputs. Questo naturalmente presuppone che la funzione viene chiamata con i arguements in formato hash, come nel seguito funzione Perl/Tk

$mw->Button(-text => "RIGHT", -command => sub { exit }) 
    ->pack(-side => 'right', -fill => 'both'); 
6

mia ($ sé,% myInputs) = @_;

Non tutte le funzioni ricevono il primo argomento $self. Di fatto, per convenzione, solo quelli richiamati usando l'operatore della freccia fanno ->; il richiamo con -> invia implicitamente un argomento speciale che si riferisce all'oggetto. Tutte le funzioni e i metodi in Perl sono dichiarati allo stesso modo (utilizzando la parola chiave sub). Solo l'invocazione determina se la funzione è o meno un metodo.

Il my ($foo, $bar) = ($x, $y); è chiamato assegnazione parallela. Questo è tutto ciò che sta succedendo qui!

Osservare che un hash può essere inizializzato da una matrice in Perl.

my @foo = qw/ foo bar baz quz /; 
my %hash = @foo; 
print $hash{foo}; # outputs bar 

Perché si sta assegnando l'hash %myInputs, l'hash viene assegnato in modo esplicito tutti gli ingressi che non il implicitamente inviato (perché si sta tirando fuori che uno in $self) sono. Ma attenzione, non avrebbe molto senso fare quanto segue, giusto?

my @foo = qw/ foo bar baz /; 
my %hash = @foo; 
print $hash{baz} # what is this set too?? 

Per lo stesso motivo, anche non ha molto senso per richiamare la funzione con una quantità non-ancora di argomenti! Entrambi genereranno un avvertimento.

+0

Ma qual è la necessità di utilizzare $ sé! Mi confonde così tanto! – user1855888

+1

@ user1855888 '$ self' si riferisce all'oggetto che stai chiamando. Se chiami 'my $ a Animal-> new', e poi chiami' $ a-> run' quindi '$ self' (primo argomento) all'interno di' sub run {} 'verrebbe impostato su' $ a'. In altre lingue lo chiamate 'this'. Puoi chiamarlo '$ this' anche in Perl se sei abituato a questo,' my $ this = shift' (sebbene sia contro la convenzione). –

1

In Perl @_; è un array globale delle variabili speciali

Simile come @ARGV L'array contiene gli argomenti della riga di comando destinati per lo script.

Quindi, in my ($self, %myInputs) = @_;

@_ rappresenterebbe l'argomento della variabile $ nell'hash-variabili %