2010-03-20 8 views
3

Comment fonctionne les fonctions grep suivantes (qu'est-ce que !/0o1Iil]/ faire?)Comment fonctionne la fonction grep de Perl avec une regex?

@chars = grep !/0o1Iil]/, 0..9, "A".."Z", "a".."z"; 
use Data::Dumper; 
print Dumper @chars; 

pour produire ce qui suit dans @chars?

$VAR1 = 0; 
$VAR2 = 1; 
$VAR3 = 2; 
$VAR4 = 3; 
$VAR5 = 4; 
$VAR6 = 5; 
$VAR7 = 6; 
$VAR8 = 7; 
$VAR9 = 8; 
$VAR10 = 9; 
$VAR11 = 'A'; 
$VAR12 = 'B'; 
$VAR13 = 'C'; 
$VAR14 = 'D'; 
$VAR15 = 'E'; 
$VAR16 = 'F'; 
$VAR17 = 'G'; 
$VAR18 = 'H'; 
$VAR19 = 'I'; 
$VAR20 = 'J'; 
$VAR21 = 'K'; 
$VAR22 = 'L'; 
$VAR23 = 'M'; 
$VAR24 = 'N'; 
$VAR25 = 'O'; 
$VAR26 = 'P'; 
$VAR27 = 'Q'; 
$VAR28 = 'R'; 
$VAR29 = 'S'; 
$VAR30 = 'T'; 
$VAR31 = 'U'; 
$VAR32 = 'V'; 
$VAR33 = 'W'; 
$VAR34 = 'X'; 
$VAR35 = 'Y'; 
$VAR36 = 'Z'; 
$VAR37 = 'a'; 
$VAR38 = 'b'; 
$VAR39 = 'c'; 
$VAR40 = 'd'; 
$VAR41 = 'e'; 
$VAR42 = 'f'; 
$VAR43 = 'g'; 
$VAR44 = 'h'; 
$VAR45 = 'i'; 
$VAR46 = 'j'; 
$VAR47 = 'k'; 
$VAR48 = 'l'; 
$VAR49 = 'm'; 
$VAR50 = 'n'; 
$VAR51 = 'o'; 
$VAR52 = 'p'; 
$VAR53 = 'q'; 
$VAR54 = 'r'; 
$VAR55 = 's'; 
$VAR56 = 't'; 
$VAR57 = 'u'; 
$VAR58 = 'v'; 
$VAR59 = 'w'; 
$VAR60 = 'x'; 
$VAR61 = 'y'; 
$VAR62 = 'z'; 

Répondre

6

Voici la grep perldoc. L'instruction de votre exemple utilise la syntaxe grep EXPR,LIST, ce qui signifie que toute expression Perl peut remplacer EXPR. Grep prend la liste qui lui est fournie et retourne uniquement les éléments où EXPR est vrai.

EXPR dans ce cas est ! /0o1Iil]/ (espace supplémentaire pour une meilleure lisibilité) qui signifie « cet article est pas abondés par l'regex /0o1Iil]/. Étant donné qu'aucun de ces éléments sont mis en correspondance par cette expression régulière (aucun d'entre eux contiennent la chaîne 0o1Iil]

Comme d'autres affiches l'ont mentionné, la regex était probablement censée lire /[0o1Iil]/, ce qui supprimerait les caractères qui pourraient être confondus, par exemple 0 et o, 1 et I. Cela semble utile pour les mots de passe ou les numéros de série. numéros, etc

Btw, vous pourriez réécrire le grep dans la plus claire sous forme de blocs, et rendre la construction de liste explicite:

@chars = grep { ! /[0o1Iil]/ } (0..9, 'A'..'Z', 'a'..'z'); 
+0

Cet exemple ressemble vraiment à un crochet ouvert, de sorte que le grep correspondrait à tout sauf à 0, à o, à 1, à i, à i et à l. – Cascabel

+0

Oui, on dirait que cela a été conçu pour générer des mots de passe ou des numéros de série, etc. où les caractères ambigus ne devraient pas être présents. – rjh

+0

oui j'ai manqué le crochet carré d'ouverture. Merci d'avoir répondu. – portoalet

2

// est un opérateur de correspondance d'expression régulière. !/[0o1Iil]/ signifie "ne correspond à aucun des caractères entre crochets." Et je pense qu'il vous manque un crochet ([) après le premier slash - l'intention est de filtrer tous les caractères qui pourraient être confondus avec d'autres (0/O, I/l/1).

+0

+1 pour repérer le '' '' manquant – vladr

1

La syntaxe générale d'un grep Perl est:

grep BLOCK LIST 

Il évalue la BLOCK pour chaque élément de LIST et retourne la valeur de la liste constituée par les éléments pour lesquels l'expression évaluée à vrai.

Dans votre cas BLOCK est !/0o1Iil]/ qui renvoie true pour les éléments qui ne contiennent pas le modèle 0o1Iil]. Puisque dans votre cas, aucun des éléments LIST ne contient ce motif, le grep renvoie l'intégralité de LIST.

avait le BLOCK été comme: !/[0o1Iil]/ qui retourne vrai pour les éléments qui ne contiennent pas un zéro ou un o minuscule, ou 1, ou I, ou ai ou al, alors vous avez a obtenu un LIST avec tous sauf ces éléments comme le résultat.

0

La fonction grep agit comme un filtre sur les listes.

Dans ce cas, la liste contient tous les caractères alphanumériques.

Le filtre est spécifié par une expression régulière. Le ! indique not.En d'autres termes, la liste résultante doit exclure tous les éléments correspondant à l'expression régulière.

L'expression régulière tente de faire correspondre toutes les occurrences de 0o1Iil] (non 0o1Iil, car l'omission d'un [ au début de l'ensemble empêchera l'expression régulière de voir la ] comme

classe de caractères métacaractère.

grep {not /0o1Iil]/} 0..9, A..Z, a..z (sans [):

Voyant que la liste ne contient pas 0..9, A..Z, a..z occurrence de 0o1Iil], il ar e aucun élément à filtrer, c'est pourquoi vous récupérez toute votre liste de caractères alphanumériques.

grep {not /[0o1Iil]/} 0..9, A..Z, a..z (Avec le [):

Tous les éléments de la liste correspondant 0, o, 1, I, i ou l seront filtrés. Ainsi, vous obtiendrez votre liste alphanumérique, sans les six caractères mentionnés ci-dessus.