Как в Perl работает функция grep с регулярным выражением? - PullRequest
3 голосов
/ 20 марта 2010

Как работает следующая функция grep (что делает !/0o1Iil]/?)

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

для получения следующего в @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';

Ответы [ 4 ]

6 голосов
/ 20 марта 2010

Вот grep perldoc . Оператор в вашем примере использует синтаксис grep EXPR,LIST, что означает, что любое выражение Perl может заменить EXPR.

grep берет предоставленный ему список и возвращает только те элементы, для которых EXPR соответствует true.

EXPR в этом случае - ! /0o1Iil]/ (пространство добавлено для удобства чтения), что означает «этот элемент не соответствует регулярному выражению /0o1Iil]/. ни один из них не содержит строку 0o1Iil]) они все возвращаются.

Как уже упоминалось другими авторами, регулярное выражение, вероятно, должно было читать /[0o1Iil]/, что удаляло бы символы, которые могли быть перепутаны, например, 0 и o, 1 и I. Это звучит полезно для паролей или серийных номеров и т. Д.

Кстати, вы можете переписать grep в более понятную форму BLOCK и сделать конструкцию LIST явной:

@chars = grep { ! /[0o1Iil]/ } (0..9, 'A'..'Z', 'a'..'z');
2 голосов
/ 20 марта 2010

// является оператором совпадения регулярного выражения. !/[0o1Iil]/ означает «не соответствует ни одному из символов в квадратных скобках». И я думаю, что вам не хватает открывающей квадратной скобки ([) после первой косой черты - целью является отфильтровать все символы, которые могут ошибочно принят за какой-то другой (0 / O, I / l / 1).

1 голос
/ 20 марта 2010

Общий синтаксис grep Perl:

grep BLOCK LIST

Он оценивает BLOCK для каждого элемента LIST и возвращает значение списка, состоящее из тех элементов, для которых выражение оценивается как true.

В вашем случае BLOCK - это !/0o1Iil]/, которые возвращают true для тех элементов, которые не содержат шаблон 0o1Iil].Поскольку в вашем случае ни один из элементов LIST не содержит этот шаблон, grep возвращает все LIST.

Если бы BLOCK было похоже на !/[0o1Iil]/, который возвращает true для тех элементов, которые не содержит ноль, или строчные буквы o, или 1, или I, или ai или al , тогда вы бы получили LIST со всеми, кроме этих элементов, в результате.

0 голосов
/ 20 марта 2010

Функция grep действует как фильтр в списках.

В этом случае список состоит из буквенно-цифровых символов.

Фильтр определяется регулярным выражением. ! обозначает not. Другими словами, результирующий список должен исключать любые элементы, соответствующие регулярному выражению.

Регулярное выражение пытается сопоставить любое вхождение 0o1Iil] (не 0o1Iil, потому что пропуск [ в начале набора не позволит регулярному выражению видеть ] как класс символов метасимвол.

grep {not /0o1Iil]/} 0..9, A..Z, a..z (без учета [):

Поскольку в списке 0..9, A..Z, a..z нет вхождения 0o1Iil], нет элементов для фильтрации, поэтому вы получаете весь список буквенно-цифровых символов.

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

Все элементы в списке, соответствующие 0, o, 1, I, i или l, будут отфильтрованы. Таким образом, вы получите обратно алфавитно-цифровой список, без вышеупомянутых шести символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...