Il me semble avoir trouvé plusieurs façons différentes de trouver la taille d'un tableau. Quelle est la différence entre ces trois méthodes?
my @arr = (2);
print scalar @arr; # First way to print array size
print $#arr; # Second way to print array size
my $arrSize = @arr;
print $arrSize; # Third way to print array size
Les première et troisième manières sont les mêmes: elles évaluent un tableau dans un contexte scalaire. Je considérerais cela comme le moyen standard d’obtenir la taille d’un tableau.
La deuxième façon renvoie en réalité le dernier index du tableau, qui n'est pas (généralement) identique à la taille du tableau.
Premièrement, le second n’équivaut pas aux deux autres. $#array
renvoie le dernier index du tableau, inférieur de un à la taille du tableau.
Les deux autres sont pratiquement les mêmes. Vous utilisez simplement deux moyens différents pour créer un contexte scalaire. Cela revient à une question de lisibilité.
Personnellement, je préfère ce qui suit:
say 0+@array; # Represent @array as a number
Je le trouve plus clair que
say scalar(@array); # Represent @array as a scalar
et
my $size = @array;
say $size;
Ce dernier a l'air tout à fait clair comme ça, mais je trouve que la ligne supplémentaire enlève toute clarté à la clarté lorsqu'elle fait partie d'un autre code. C'est utile pour enseigner ce que @array
fait dans un contexte scalaire, et peut-être si vous voulez utiliser $size
plus d'une fois.
Cela obtient la taille en forçant le tableau dans un contexte scalaire, dans lequel il est évalué en tant que sa taille:
print scalar @arr;
C'est une autre façon de forcer le tableau dans un contexte scalaire, car il est assigné à une variable scalaire:
my $arrSize = @arr;
Cela obtient l'index du dernier élément du tableau, c'est donc la taille moins 1 (en supposant que les index commencent à 0, ce qui est réglable en Perl bien que ce soit une mauvaise idée de le faire):
print $#arr;
Ce dernier n'est pas vraiment bon à utiliser pour obtenir la taille du tableau. Ce serait utile si vous voulez juste obtenir le dernier élément du tableau:
my $lastElement = $arr[$#arr];
En outre, comme vous pouvez le voir ici sur Stack Overflow, cette construction n'est pas gérée correctement par la plupart des surligneurs de syntaxe ...
Pour utiliser la deuxième manière, ajoutez 1:
print $#arr + 1; # Second way to print array size
Tous les trois donnent le même résultat si nous modifions un peu le second:
my @arr = (2, 4, 8, 10);
print "First result:\n";
print scalar @arr;
print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.
print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;
Exemple:
my @a = (undef, undef);
my $size = @a;
warn "Size: " . $#a; # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
Il existe différentes façons d’imprimer la taille d’un tableau. Voici la signification de tous: Disons que notre tableau est my @arr = (3,4);
C'est la bonne façon d'obtenir la taille des tableaux.
print scalar @arr; # prints size, here 2
$#arr
donne le dernier index d'un tableau. Ainsi, si array est de taille 10, son dernier index sera 9.
print $#arr; # prints 1, as last index is 1
print $#arr + 1; # Add 1 to last index to get array size
Nous ajoutons 1 en considérant le tableau comme indexé sur. Mais, si ce n'est pas basé sur zéro, alors, cette logique échouera.
Perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;' # prints 6
L'exemple ci-dessus imprime 6, car nous avons défini son index initial à 4. Maintenant, l'index serait 5 et 6, avec les éléments 3 et 4 respectivement.
Lorsqu'un tableau est utilisé dans un contexte scalaire, il renvoie la taille du tableau.
my $size = @arr;
print $size; # prints size, here 2
En réalité, la méthode 3 et la méthode 1 sont identiques.
Le section “Types de variables Perl” de la documentation de Perlintro contient
La variable spéciale
$#array
vous indique l'indice du dernier élément d'un tableau:print $mixed[$#mixed]; # last element, prints 1.23
Vous pourriez être tenté d'utiliser
$#array + 1
pour vous dire le nombre d'éléments contenus dans un tableau. Ne te dérange pas. En l'occurrence, utiliser@array
où Perl s'attend à trouver une valeur scalaire ("in scalar context") vous donnera le nombre d'éléments dans le tableau:if (@animals < 5) { ... }
La documentation perldata couvre également cela dans la section section "Valeurs scalaires" .
Si vous évaluez un tableau dans un contexte scalaire, la longueur du tableau est renvoyée. (Notez que ce n'est pas le cas des listes qui renvoient la dernière valeur, comme l'opérateur C, des virgules, ni des fonctions intégrées, qui renvoient ce qu'elles ont l'impression de renvoyer.) Ce qui suit est toujours vrai:
scalar(@whatever) == $#whatever + 1;
Certains programmeurs choisissent d'utiliser une conversion explicite afin de ne laisser aucun doute:
$element_count = scalar(@whatever);
Plus tôt dans la même section, vous apprendrez comment obtenir l'index du dernier élément d'un tableau.
La longueur d'un tableau est une valeur scalaire. Vous pouvez trouver la longueur du tableau
@days
en évaluant$#days
, comme danscsh
. Cependant, ce n’est pas la longueur du tableau; c’est l’indice du dernier élément, ce qui est une valeur différente puisqu’il existe habituellement un 0ème élément.
De perldoc perldata , qui devrait être sûr de citer:
Ce qui suit est toujours vrai:
scalar(@whatever) == $#whatever + 1;
Tant que vous n'effectuez pas # $ ++ et que vous augmentez mystérieusement la taille ou votre tableau.
Les indices de tableau commencent par 0.
et
Vous pouvez tronquer un tableau à zéro en lui assignant la liste null list (). Les éléments suivants sont équivalents:
@whatever = (); $#whatever = -1;
Ce qui m'amène à ce que je cherchais, à savoir comment détecter le tableau est vide. Je l'ai trouvé si $ # empty == -1;
Qu'en est-il de int(@array)
puisqu'il menace l'argument en tant que scalaire.
Pour trouver la taille d'un tableau, utilisez le mot clé scalar
:
print scalar @array;
Pour trouver le dernier index d'un tableau, il faut utiliser $#
(variable par défaut de Perl). Il donne le dernier index d'un tableau. Comme un tableau commence à 0, nous obtenons sa taille en ajoutant un à $#
:
print "$#array+1";
Exemple:
my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";
Sortie:
3
3