Regex Perl';s grep函数是否与正则表达式一起工作?

Regex Perl';s grep函数是否与正则表达式一起工作?,regex,perl,grep,Regex,Perl,Grep,下面的grep函数是如何工作的(什么是!/0o1il]/做的?) 要在@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

下面的grep函数是如何工作的(什么是
!/0o1il]/
做的?)

要在@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';
这是我的建议。示例中的语句使用了
grep EXPR,LIST
语法,这意味着任何Perl表达式都可以代替
EXPR

grep获取提供给它的列表,并且只返回EXPR为true的项目

本例中的EXPR是
/0O1IL]/
(为可读性添加了空格),这意味着“此项未与正则表达式匹配”
/0O1IL]/
。由于这些项都未与该正则表达式匹配(它们都不包含字符串
0O1IL]
),因此都将返回

正如其他海报所提到的,regex可能应该读
/[0o1il]/
,这将删除可能混淆的字符,例如0和o、1和I。这听起来对密码或序列号等很有用

顺便说一句,您可以将grep重写为更清晰的块形式,并使列表构造明确:

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

/
是一个正则表达式匹配运算符。
!/[0o1Iil]/
表示“不匹配方括号中的任何字符”。我认为您在第一个斜杠后缺少一个开头方括号(
[
),目的是过滤掉所有可能被误认为其他字符的字符(0/O,I/l/1)。

Perl grep的一般语法是:

grep BLOCK LIST
它为
列表
的每个元素计算
,并返回由表达式计算为true的元素组成的列表值

在您的例子中,
!/0o1il]/
,对于那些不包含模式的元素,
0o1il]
返回true。因为在您的例子中,
列表
元素都不包含该模式,所以grep返回整个
列表


块是否类似于:
!/[0o1il]/
对于那些不包含零、小写字母o、1、I、I或l的元素返回true,那么您将得到一个
列表,其中包含除这些元素以外的所有元素。

grep
函数充当列表的过滤器

在这种情况下,列表中的所有字符都是字母数字字符

筛选器由正则表达式指定。
表示
而不是
。换句话说,结果列表应排除与正则表达式匹配的任何项

正则表达式正在尝试匹配任何出现的
0o1il]
(而不是
0o1il
),因为在集合的开头省略
[
将阻止正则表达式将
]
视为字符类元字符

grep{not/0o1il]/}0..9,A..Z,A..Z
(不带
[
):

看到列表
0..9,A..Z,A..Z
中没有出现
0o1il]
,就没有要过滤掉的项目了,这就是为什么您可以返回整个字母数字字符列表的原因

grep{not/[0o1il]/}0..9,A..Z,A..Z
(使用
[
):


列表中与
0
o
1
I
I
l
匹配的任何项目都将被过滤掉。因此,您将返回字母数字列表,而不包含上述六个字符。

这个示例看起来确实应该有一个开括号,以便grep能够匹配除了0、o、1、I、I和l之外的所有内容。是的,听起来像是设计用于生成密码或序列号等,其中不应存在歧义字符。是的,我错过了开头的方括号。感谢您的回答。是的,这是设计用于生成密码的。
grep BLOCK LIST