Il me semble avoir rencontré 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
print 0+@arr
,print "".@arr
,print ~~@arr
"".@arr
comme"@arr"
quelque chose de très différent.Réponses:
Les première et troisième façons sont les mêmes: elles évaluent un tableau dans un contexte scalaire. Je considère que c'est la façon standard d'obtenir la taille d'un tableau.
La deuxième façon renvoie en fait le dernier index du tableau, qui n'est pas (généralement) le même que la taille du tableau.
la source
$[
spécifie "L'index du premier élément d'un tableau et du premier caractère d'une sous-chaîne" (perldoc perlvar
). Il est défini sur 0 par défaut, et le définir sur autre chose que 0 est fortement déconseillé.$[
est découragé (et ce depuis une décennie).$[
est obsolète. L'utilisation$[
émet un avertissement de dépréciation même lorsque l'on n'active pas les avertissements. Assigner autre chose que zéro à$[
sera une erreur en 5.16. Pouvons-nous arrêter de mentionner$[
déjà?$[
qui en connaîtrait les effets.scalar @arr
et$#arr
devrait toujours comprendre les effets possibles de$[
, aussi rares soient-ils.Premièrement, le second n'est pas équivalent aux deux autres.
$#array
renvoie le dernier index du tableau, qui est un de moins que 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:
Je trouve cela plus clair que
et
Ce dernier semble assez clair seul comme celui-ci, mais je trouve que la ligne supplémentaire enlève de la clarté lorsqu'elle fait partie d'un autre code. Il est utile pour enseigner ce qui
@array
fait dans un contexte scalaire, et peut-être si vous souhaitez utiliser$size
plus d'une fois.la source
my $size=@array
il semble que ce soit une erreur lorsque le mauvais sceau a été utilisé.scalar
sans raison apprennent la mauvaise leçon. Ils commencent à penser que les opérateurs renvoient des listes qui peuvent être forcées en scalaires. Vu des dizaines de fois.scalar
parce que vous contraignez la liste à un contexte scalaire. C'est la bonne raison de l'utiliser. Votre exemple fait exactement la même chose, mais repose sur ce que Perl fait lorsque vous évaluez une variable de liste dans un contexte implicitement scalaire. Ainsi, votre exemple nécessite que le lecteur connaisse le comportement implicite de Perl dans ce contexte. Vous ajoutez simplement une couche supplémentaire de comportement implicite à l'expression, et Perl a déjà trop de comportement implicite que vous devez raisonner pour déchiffrer un programme.scalar
parce que vous contraignez la liste à un contexte scalaire", Vous avez prouvé mon point sur la mauvaise leçon. C'est complètement faux. Aucune liste n'est jamais contrainte parscalar
. (Si c'était le cas,scalar(@array)
etscalar(@array[0..$#array])
retournerait la même chose.)scalar(@array)
Dit@array
de retourner un scalaire, avec lequel vous lui avez déjà dit de fairemy $size=
.Cela obtient la taille en forçant le tableau dans un contexte scalaire, dans lequel il est évalué comme sa taille:
C'est une autre façon de forcer le tableau dans un contexte scalaire, car il est affecté à une variable scalaire:
Cela obtient l'index du dernier élément du tableau, il s'agit donc en fait de la taille moins 1 (en supposant que les index commencent à 0, ce qui est réglable en Perl, bien que cela soit généralement une mauvaise idée):
Ce dernier n'est pas vraiment bon à utiliser pour obtenir la taille du tableau. Il serait utile si vous souhaitez simplement obtenir le dernier élément du tableau:
De plus, 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 ...
la source
$arr[-1]
pour obtenir le dernier élément. Et$arr[-2]
pour obtenir l'avant-dernier, et ainsi de suite.$#arr
n'est pas une fonctionnalité très utile, et ce n'est pas un hasard si d'autres langues ne l'ont pas.Pour utiliser la deuxième méthode, ajoutez 1:
la source
for [0..$#array] { print $array[$_ ] }
fonctionne très bien si le but d'obtenir le nombre d'éléments est de parcourir le tableau. L'avantage étant que vous obtenez l'élément ainsi qu'un compteur alignés.Tous les trois donnent le même résultat si nous modifions un peu le second:
la source
Exemple:
la source
La section «Types de variables Perl» de la documentation perlintro contient
La documentation des perldata couvre également cela dans la section «Valeurs scalaires» .
Plus haut dans la même section explique comment obtenir l'index du dernier élément d'un tableau.
la source
Il existe différentes façons d'imprimer la taille du tableau. Voici la signification de tous: Disons que notre tableau est
my @arr = (3,4);
Méthode 1: scalaire
C'est la bonne façon d'obtenir la taille des tableaux.
Méthode 2: numéro d'index
$#arr
donne le dernier index d'un tableau. donc si le tableau est de taille 10 alors son dernier index serait 9.Nous ajoutons 1 ici en considérant le tableau comme indexé 0 . Mais, s'il n'est pas basé sur zéro, cette logique échouera .
L'exemple ci-dessus imprime 6, car nous avons défini son index initial à 4. L'index serait maintenant 5 et 6, avec les éléments 3 et 4 respectivement.
Méthode 3:
Lorsqu'un tableau est utilisé dans un contexte scalaire, il renvoie la taille du tableau
En fait, la méthode 3 et la méthode 1 sont identiques.
la source
De perldoc perldata , qui devrait être sûr de citer:
Tant que vous ne faites pas $ # n'importe quoi ++ et augmentez mystérieusement la taille ou votre tableau.
et
Ce qui m'amène à ce que je cherchais, à savoir comment détecter que le tableau est vide. Je l'ai trouvé si $ # empty == -1;
la source
Qu'en est-il de
int(@array)
est-il car il menace l'argument comme scalaire.la source
Pour trouver la taille d'une utilisation du tableau le
scalar
mot - clé:Pour connaître le dernier index d'un tableau, il existe
$#
(variable Perl par défaut). Il donne le dernier index d'un tableau. Lorsqu'un tableau commence à 0, nous obtenons la taille du tableau en en ajoutant un à$#
:Exemple:
Production:
la source