Je suis Perl débutant, je lis sur grep code> fonction pour filtrer une liste. Je suis tombé sur le programme suivant. #!/usr/bin/perl
use strict;
use warnings;
# initialize an array
my @array = qw(3 4 5 6 7 8 9);
# first syntax form:
my @subArray = grep { $_ & 1 } @array;
5 Réponses :
Donc, en bref, le L'utilisation de $ _ code> est l'expression actuelle. Dans ce cas, chaque élément de tableau. P>
& code> est le binaire et l'opérateur. p>
grep code> correspondra à n'importe quel élément de tableau qui est un nombre impair. P>
$ _ code> avec grep code> est documentée dans perdoc .
La signification de & code> est également dans le perdoc . p>
& is the bitwise AND
À titre d'exemple, supposons que $ _ est 123 alors sa représentation binaire serait un autre exemple $ _ code> est la variable qui détient la valeur actuellement testée, & code> est le binaire et l'opérateur, et 1 code> est juste le numéro un. Cette expression combine tous les bits des deux $ _ code> et 1 code> les uns avec les autres par logique et. Donc, il renvoie 1 si la valeur est impair et 0 si la valeur est même. 1111011 code>. Le nombre décimal 1 serait 00000001 code>, donc combinant tous les bits par et vous obtenez p> 200 & 100 code> p>
Dans le deuxième exemple ( 200 & 100 code>), la réponse est-elle 64 code> ou ma façon de conversion est fausse?
Vous avez raison, cela doit être 64 bien sûr. La 128 était une erreur de ma part.
$ _ code> est une variable définie par la fonction GREP. La plupart des fonctions Perl manipulent $ _ si non spécifié autrement. Grep CODE> appelle le SUB anonyme défini (qui est {$ _ & 1} code>) pour chaque élément de @array et fait un et code>. Si le résultat est une valeur réelle, il est ajouté à la matrice résultante. P>
Autant d'avoir signalé, par exemple, De même, qui dit, une solution alternative de filtrer des nombres impairs est de & code> est le bitwise-et l'opérateur. Cela signifie que les deux nombres comparés sont transformés en bits et comparé: 3 et 1 code> renvoie 1 code>, qui évalue à vrai à l'intérieur du GREP: p> 4 & 1 code> retourne 0 code>, qui est faux: p>
mod code> le numéro avec 2: p>
FYI: Il s'agit d'un piratage qui ne devrait jamais être utilisé dans le code de production b> à moins que l'exploitation de seuls éléments impairs soit analysé comme un goulot d'étranglement de la performance dans une implémentation plus lisible.
@Dvk hm, comme pour mon intérêt: ce conseil est-il utilisé?
$ _ || = $ val code>@Loldop -
|| = code> L'opérateur est parfaitement approprié Perl idiomatique, pas un piratage. Cependant, en utilisant£ _ code> par opposition à l'utilisation d'une auto-documentée-nommée-variavle est très souvent un signe de code mal écrit, sauf si utilisé dans une cartetrès courte//grep code> bloc.@Varamesh, je pense, vous pouvez utiliser cette expression:
($ _% 2) code> éléments, qui se reposent 1 dans la bague moulo 2@DVK merci pour des informations.