web-dev-qa-db-fra.com

Trouver la taille d'un tableau en Perl

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
234
David

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.

226
Chris Jester-Young

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.

39
ikegami

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 ...

27
Nate C-K

Pour utiliser la deuxième manière, ajoutez 1:

print $#arr + 1; # Second way to print array size
6
jhoanna

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
Zon

Exemple:

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

warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
5
dimas

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);

Méthode 1: scalaire

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

print scalar @arr;  # prints size, here 2

Méthode 2: numéro d'index

$#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.

Méthode 3:

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.

2
Kamal Nayan

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 dans csh. 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.

2
Greg Bacon

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;

2
jwal

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

1
Reflective

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
0
Sandeep_black