如何在多个条件上过滤数组?

Raj*_*Urs 1 perl perl-module

我正在尝试查找以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)

dar*_*rch 8

你的问题是逻辑之一.你说你想过滤所有"以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)


obs*_*ite 5

你走在正确的轨道上,但是你已经在你的正则表达中引入了空白.您还要求字符串以字符"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)

  • 好问题......在这里,有一个upvote! (2认同)