7
votes

Passer une référence scalaire à Perl

Je sais que le passage d'un scalaire à un SUB est en train de passer la référence, mais puisque je suis nouveau à Perl, j'ai toujours fait le test suivant:

#!/usr/bin/perl
$i = 2;
subr(\$i);
sub subr{
    print $_[0]."\n";
    print $$_[0]."\n";
}


0 commentaires

4 Réponses :


16
votes

C'est parce que votre deuxième instruction d'impression est équivalente à ce que ... xxx

Lorsque ce que vous voulez est xxx

dans d'autres Mots, la désémaraison se produit avant que l'indice de tableau est évalué.

Lorsque vous ajoutez ces courriers, il dit à Perl comment interpréter l'expression comme vous le souhaitez; Il évaluera _ [0] d'abord, puis de référence pour obtenir la valeur.


0 commentaires

8
votes

C'est une chose d'ordre d'évaluation.

  ${$_[0]}


0 commentaires

1
votes

Vous n'avez pas à transmettre une référence à $ i code>. La notation € _ [0] code> est un em> alias em> pour $ i code> lorsque vous l'invoquez comme subr ($ i) code >.

ok 1 - $i == 2
ok 2 - $i == 3
ok 3 - subr2 *dies* trying to modify a literal
ok 4 - $s eq 'litx'
ok 5 - $s2 eq 'litx'
ok 6 - subr2 lives with heap variables
1..6


0 commentaires

3
votes

$$ _ [0] est comme $ foo [0] , uniquement avec $ _ à la place du nom de la matrice. Cela signifie $ _ est traité comme une référence de tableau, et l'expression n'implique pas la référence scalaire $ _ [0] du tout. $ _--> [0] est équivalent, à l'aide de la syntaxe alternative -> . La syntaxe pour la derréférance peut sembler arbitraire et difficile à retenir, mais il y a un sens et une commande sous-jacents; Une très bonne présentation est à http://perlmonks.org/?node=references+Quick + Référence .


0 commentaires