我正在尝试查找以S和N开头的所有数组元素,但下面的代码不会这样做:
@a = qw(sonata Samsung sony icic huawie nissan nokia);
Run Code Online (Sandbox Code Playgroud)
这是我的代码
@filter = grep { (/^s (.*)$/ig) && (/^n(.*)$/ig) } @a;
print "@filter \n";
Run Code Online (Sandbox Code Playgroud)
你的问题是逻辑之一.你说你想过滤所有"以S和N开头"的字符串,但事实并非如此.您希望所有字符串以 S或N 之一开头.
对于"以S和N开头"的字符串,其第一个字符必须是S,它也必须是N,这是不可能的.
表达方式
grep { (/^s (.*)$/ig) and (/^n(.*)$/ig) } @a;
Run Code Online (Sandbox Code Playgroud)
无论价值是多少,都会一直返回空列表@a.中的每个元素@a将被考虑,但没有人开始都s和n-因为那是不可能的.
你想,而不是什么是测试是否在字符串@a匹配或者小号或 N,就像这样:
grep { (/^s (.*)$/ig) or (/^n(.*)$/ig) } @a;
Run Code Online (Sandbox Code Playgroud)
想要匹配许多可能性实际上是一个非常普遍的需求,所以有一个特殊的符号表示这样做.阿"字符类别"创建匹配的几种可能性任一项所述的新的原子. .是一个字符类,可以使用尖括号创建自定义字符类[].
从而:
grep { /^[sn]/i) } @a;
Run Code Online (Sandbox Code Playgroud)
你走在正确的轨道上,但是你已经在你的正则表达中引入了空白.您还要求字符串以字符"S"或字符"N"开头的情况,因此您的逻辑是OR语句,而不是写入的AND语句.如果你关心的只是第一个角色,那就是你模式中所需的全部内容,并且你想要使用逻辑OR.
@a = qw(sonata Samsung sony icic huawie nissan nokia);
@filter = grep { /^s/i || /^n/i } @a;
print "@filter \n";
Run Code Online (Sandbox Code Playgroud)
结果:
sonata Samsung sony nissan nokia
Run Code Online (Sandbox Code Playgroud)
编辑 - 或者更简洁地使用角色类
@a = qw(sonata Samsung sony icic huawie nissan nokia);
@filter = grep { /^[sn]/i } @a;
print "@filter \n";
Run Code Online (Sandbox Code Playgroud)