Stai confondendo due cose diverse. Prima di tutto, quando si utilizza my
di dichiarare diverse variabili, è necessario utilizzare le parentesi:
my $foo, $bar;
Non funziona, in quanto è considerato come due affermazioni diverse:
my $foo;
$bar;
quindi è necessario parentesi a raggruppare l'argomento in elenco argomento della funzione my
:
my($foo, $bar);
In secondo luogo, si ha il raggruppamento esplicito per invocare un contesto di lista:
$foo, $bar = "a", "b"; # wrong!
saranno prese in considerazione tre prospetti separati:
$foo;
$bar = "a";
"b";
Ma se si utilizza parentesi per raggruppare $foo
e $bar
in un elenco, il operatore di assegnazione userà un contesto di lista:
($foo, $bar) = ("a", "b");
Curiosamente, se si rimuove le parentesi RHS, sarà anche l'esperienza un hickup:
($foo, $bar) = "a", "b"; # Useless use of a constant (b) in void context
ma è perché l'operatore =
ha precedenza maggiore rispetto virgola ,
, che potete vedere in perlop. Se si tenta:
my @array = ("a", "b");
($foo, $bar) = @array;
Si otterrà il comportamento desiderato senza parentesi.
Ora per completare il cerchio, permette rimuovere il contesto di lista di cui sopra e vedere cosa succede:
my @array = ("a", "b");
$foo = @array;
print $foo;
Questo stampa 2
, perché la matrice viene valutata in un contesto scalare, e gli array in un contesto scalare restituisce il numero di elementi che contengono In questo caso, è 2
.
Pertanto, tali affermazioni contesto lista uso:
my ($foo) = @array; # $foo is set to $array[0], first array element
my ($bar) = ("a", "b", "c"); # $bar is set to "a", first list element
è un modo di override contesto scalare che è implicato in assegnazione scalare. Per confronto, queste assegnazioni sono in contesto scalare:
my $foo = @array; # $foo is set to the number of elements in the array
my $bar = ("a", "b", "c"); # $bar is set to "c", last list element
potrebbe essere utile per la manutenzione, se è evidente che una lista potrebbe essere l'aspettativa futura. Normalmente lo uso durante la lettura degli argomenti di subroutine, come 'my ($ arg1) = @ _' piuttosto che' my $ arg1 = shift' – Unos
Sono abituato a digitare 'my ('. E, una lista di un elemento è ancora una lista. :) –