Questo codice funziona:
#!/bin/perl -w
use strict;
sub PrintAA
{
my($test, %aa) = @_;
print $test . "\n";
foreach (keys %aa)
{
print $_ . " : " . $aa{$_} . "\n";
}
}
my(%hash) = ('aaa' => 1, 'bbb' => 'balls', 'ccc' => \&PrintAA);
PrintAA("test", %hash);
Il punto chiave è l'uso del contesto array nella mia() 'istruzione' nella funzione.
Che cosa significa il contesto di business serie effettivamente fare?
In modo succinto, funziona correttamente.
Significa che il primo valore nell'array @_
di argomenti è assegnato a $test
e che gli elementi rimanenti sono assegnati all'hash %aa
. Dato il modo in cui l'ho chiamato, c'è un numero dispari di articoli nel @_
, quindi una volta assegnato il primo elemento a $test
, c'è un numero pari di elementi disponibili da assegnare a %aa
, con il primo elemento di ciascuna coppia che è il key ('aaa', 'bbb', 'ccc' nel mio esempio), e il secondo è il valore corrispondente.
Sarebbe possibile sostituire %aa
con @aa
, nel qual caso l'array avrà 6 elementi. Sarebbe anche possibile sostituire %aa
con $aa
e, in tal caso, la variabile $aa
conterrà il valore 'aaa' e i valori rimanenti in @_
verranno ignorati dall'assegnazione.
Se si omettono le parentesi attorno all'elenco delle variabili, Perl rifiuta di compilare il codice. Una delle risposte alternative hanno mostrato la notazione:
my $test = shift;
my(%aa) = @_;
Questo è più o meno equivalente a quello che ho scritto; la differenza è che dopo le due istruzioni my
, @_
contiene solo 6 elementi in questa variante, mentre nella versione singola my
contiene ancora 7 elementi.
Ci sono altre domande nello SO sul contesto dell'array.
In realtà, non è stato chiesto circa la my($test, %aa) = @_;
stavo chiedendo my(%hash) = ('aaa' => 1, 'bbb' => 'balls', 'ccc' => \&PrintAA);
contro my %hash = { 'aaa' => 1, ... };
La differenza è che il {...} notazione genera un ref hash e il (...) genera una lista, che mappa ad un hash (al contrario di hash ref). Allo stesso modo, [...] genera un array ref e non un array.
Effettivamente, modificare il codice "principale" in modo che legga: my (% hash) = {...}; e si ottiene un run-time (ma non tempo di compilazione) Errore - numeri di linea trattare con cautela, in quanto ho aggiunto codifiche alternative al mio file:
Reference found where even-sized list expected at xx.pl line 18.
...
Use of uninitialized value in concatenation (.) or string at xx.pl line 13.
Puoi mostrarci il codice? –
Puoi mostrarci il codice chiamante? –