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

时间:2015-11-26 08:11:19

标签: perl perl-module

我正在尝试查找以S和N开头的所有数组元素,但下面的代码没有这样做:

@a = qw(sonata Samsung sony icic huawie nissan nokia);

这是我的代码

@filter = grep { (/^s (.*)$/ig) && (/^n(.*)$/ig) } @a;
print "@filter \n";

3 个答案:

答案 0 :(得分:8)

你的问题是逻辑之一。你说你想过滤所有以S和N"开头的字符串,但这不是真的。您希望所有以 S或N

之一开头的字符串。

对于以#和S#开头的字符串,它的第一个字符必须是S,而必须是N,这是不可能的。< / p>

表达式

grep { (/^s (.*)$/ig) and (/^n(.*)$/ig) } @a;
无论@a的值是多少,

总会返回空列表。将考虑@a中的每个元素,但它们都不以sn开头 - 因为这是不可能的。

您想要的是测试@a中的字符串是否匹配 N,如下所示:

grep { (/^s (.*)$/ig) or (/^n(.*)$/ig) } @a;

但是,想要匹配多种可能性实际上是一个非常普遍的需求,所以这样做有一个特殊的符号。 "character class"创建一个匹配多种可能性中的任何一种的新原子。 .是一个字符类,可以使用尖括号[]创建自定义字符类。

因此:

grep { /^[sn]/i) } @a;

答案 1 :(得分: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";

结果:

sonata Samsung sony nissan nokia

编辑 - 或者更简洁地使用角色类

@a = qw(sonata Samsung sony icic huawie nissan nokia);
@filter = grep { /^[sn]/i } @a;
print "@filter \n";

答案 2 :(得分:0)

只需匹配以sn开头的任何字词。以下代码将为您提供所需的输出:

my @arr = qw(sonata Samsung sony icic huawie nissan nokia);
my @filter = grep { /^[sn]/i } @arr;
print "@filter \n";

其中^[sn]将匹配以sn开头的任何字词。

输出:

sonata Samsung sony nissan nokia