Trouver la taille d'un tableau dans Perl

il me semble avoir trouver différentes façons 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
230
demandé sur Peter Mortensen 2011-09-13 22:40:47

11 réponses

les première et troisième voies sont les mêmes: elles évaluent un tableau dans un contexte scalaire. Je considère que c'est le moyen standard pour obtenir un tableau de taille.

la seconde façon retourne en fait le dernier indice du tableau, qui n'est pas (habituellement) la même que la taille du tableau.

220
répondu Chris Jester-Young 2011-09-13 18:44:05

premièrement, le second n'est pas équivalent aux deux autres. $#array renvoie le dernier indice du tableau, qui est inférieur à la taille du tableau.

les deux autres sont pratiquement identiques. Vous utilisez simplement deux moyens différents pour créer un contexte scalaire. C'est une question de lisibilité.

je préfère personnellement 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 assez clair seul comme ceci, mais je trouve que la ligne supplémentaire enlève de la clarté quand une partie d'un autre code. Il est utile pour enseigner ce que @array fait dans un contexte scalaire, et peut-être si vous voulez utiliser $size plus d'une fois.

34
répondu ikegami 2017-12-01 23:42:21

cela obtient la taille en forçant le tableau dans un contexte scalaire, dans lequel il est évalué comme sa taille:

print scalar @arr;

c'est une autre façon de forcer le tableau dans un contexte scalaire, puisqu'il est assigné à une variable scalaire:

my $arrSize = @arr;

cela obtient l'indice du dernier élément dans le tableau, donc c'est en fait la taille moins 1 (en supposant que les indices commencent à 0, qui est réglable en Perl bien que faisant ainsi est habituellement une mauvaise idée):

print $#arr;

ce dernier n'est pas vraiment bon à utiliser pour obtenir la taille du tableau. Il serait utile si vous voulez juste pour obtenir le dernier élément du tableau:

my $lastElement = $arr[$#arr];

aussi, comme vous pouvez le voir ici sur le débordement de la pile, cette construction n'est pas gérée correctement par la plupart des surligneurs de syntaxe...

27
répondu Nate C-K 2015-10-03 08:13:54

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;
5
répondu Zon 2013-10-23 04:32:07

exemple:

my @a = (undef, undef);
my $size = @a;

warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
5
répondu dimas 2015-10-03 08:15:51

pour utiliser la seconde voie, ajouter 1:

print $#arr + 1; # Second way to print array size
5
répondu jhoanna 2015-10-03 08:16:23

Le "Perl types de variables" de la section de la perlintro documentation contient

La variable spéciale $#array vous indique l'index 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 indiquer le nombre d'éléments dans un tableau. Ne vous embêtez pas. Il se trouve que L'utilisation de @array où Perl s'attend à trouver un valeur scalaire ("dans un contexte scalaire") vous donne le nombre d'éléments dans le tableau:

if (@animals < 5) { ... }

la documentation perldata couvre également ce point dans la " section "valeurs scalaires".

Si vous évaluez un tableau dans un contexte scalaire, retourne la longueur de la matrice. (Notez que ce n'est pas le cas des listes, qui renvoient la dernière valeur, comme l'opérateur de virgule C, ni de fonctions intégrées, qui rendent ce qu'elles veulent.) Ce qui suit est toujours vrai:

scalar(@whatever) == $#whatever + 1;

certains programmeurs choisissent d'utiliser une conversion explicite pour ne laisser aucun doute:

$element_count = scalar(@whatever);

plus tôt dans la même section documente 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 dans csh . Cependant, ce n'est pas la longueur du tableau; c'est l'indice du dernier élément, qui est un autre de valeur, car il ya habituellement un 0e élément.

2
répondu Greg Bacon 2015-08-03 15:48:11

il y a plusieurs façons d'Imprimer la taille du tableau. Voici les significations de tous: Disons que notre tableau est my @arr = (3,4);

Méthode 1: scalaire

Ce est la bonne façon d'obtenir la taille des tableaux.

print scalar @arr;  # prints size, here 2

Méthode 2: indice 151990920"

$#arr donne le dernier index d'un tableau. donc si array est de taille 10 alors son dernier indice serait 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 ici, considérant array comme 0-indexé . Mais, si elle n'est pas basée sur zéro alors, cette logique échouera .

perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;'   # prints 6

au-dessus de l'exemple imprime 6, parce que nous avons réglé son index initial à 4. Maintenant, l'indice serait de 5 et 6, avec les éléments 3 et 4 respectivement.

Méthode 3:

quand un tableau est utilisé dans un contexte scalaire, alors il renvoie la taille du tableau

my $size = @arr;
print $size;   # prints size, here 2

en fait, la méthode 3 et la méthode 1 sont les mêmes.

2
répondu Kamal Nayan 2017-05-09 15:12:14

De perldoc perldata , qui devrait être bon pour la citation:

ce qui suit est toujours vrai:

scalar(@whatever) == $#whatever + 1;

juste tant que vous ne faites pas $#whatever++ et augmentez mystérieusement la taille ou votre tableau.

les indices des tableaux commencent par 0.

et

Vous pouvez tronquer un tableau vers le bas à zéro en lui assignant la liste nulle (). Sont équivalents:

    @whatever = ();
    $#whatever = -1;

ce qui m'amène à ce que je cherchais qui est comment détecter le tableau est vide. Je l'ai trouvé si $#vide == -1;

2
répondu jwal 2017-05-09 19:03:22

pour trouver la taille d'un tableau utilisez le scalar mot clé:

print scalar @array;

pour connaître le dernier index d'un tableau il y a $# (variable Perl par défaut). Il donne le dernier index d'un tableau. Comme un tableau commence à partir de 0, nous obtenons la taille du tableau en ajoutant un à $# :

print "$#array+1";

exemple:

my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";

sortie:

3

3
0
répondu Sandeep_black 2017-05-08 23:39:35

Qu'en est-il de int(@array) comme il menace l'argument comme scalaire.

0
répondu Reflective 2018-03-13 20:42:40