9
votes

Comment ça marche "$ _ & 1" à Perl

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 commentaires

FYI: Il s'agit d'un piratage qui ne devrait jamais être utilisé dans le code de production à 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


@Loldop - || = L'opérateur est parfaitement approprié Perl idiomatique, pas un piratage. Cependant, en utilisant £ _ 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 carte très courte / / grep bloc.


@Varamesh, je pense, vous pouvez utiliser cette expression: ($ _% 2) éléments, qui se reposent 1 dans la bague moulo 2


@DVK merci pour des informations.


5 Réponses :


1
votes

$ _ est l'expression actuelle. Dans ce cas, chaque élément de tableau.

& est le binaire et l'opérateur.

Donc, en bref, le grep correspondra à n'importe quel élément de tableau qui est un nombre impair.

L'utilisation de $ _ avec grep est documentée dans perdoc . La signification de & est également dans le perdoc .


0 commentaires

2
votes
&  is the bitwise AND 

0 commentaires

10
votes

$ _ est la variable qui détient la valeur actuellement testée, & est le binaire et l'opérateur, et 1 est juste le numéro un. Cette expression combine tous les bits des deux $ _ et 1 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.

À titre d'exemple, supposons que $ _ est 123 alors sa représentation binaire serait 1111011 . Le nombre décimal 1 serait 00000001 , donc combinant tous les bits par et vous obtenez xxx

un autre exemple 200 & 100 xxx


2 commentaires

Dans le deuxième exemple ( 200 & 100 ), la réponse est-elle 64 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.



0
votes

$ _ est une variable définie par la fonction GREP. La plupart des fonctions Perl manipulent $ _ si non spécifié autrement. Grep appelle le SUB anonyme défini (qui est {$ _ & 1} ) pour chaque élément de @array et fait un et . Si le résultat est une valeur réelle, il est ajouté à la matrice résultante.


0 commentaires

4
votes

Autant d'avoir signalé, & est le bitwise-et l'opérateur. Cela signifie que les deux nombres comparés sont transformés en bits et comparé:

par exemple, 3 et 1 renvoie 1 , qui évalue à vrai à l'intérieur du GREP: xxx

De même, 4 & 1 retourne 0 , qui est faux: xxx < / pré>


qui dit, une solution alternative de filtrer des nombres impairs est de mod le numéro avec 2: xxx


0 commentaires