我正在尝试查找以S和N开头的所有数组元素,但下面的代码没有这样做:
@a = qw(sonata Samsung sony icic huawie nissan nokia);
这是我的代码
@filter = grep { (/^s (.*)$/ig) && (/^n(.*)$/ig) } @a;
print "@filter \n";
答案 0 :(得分:8)
你的问题是逻辑之一。你说你想过滤所有以S和N"开头的字符串,但这不是真的。您希望所有以 S或N
之一开头的字符串。对于以#和S#开头的字符串,它的第一个字符必须是S,而也必须是N,这是不可能的。< / p>
表达式
grep { (/^s (.*)$/ig) and (/^n(.*)$/ig) } @a;
无论@a
的值是多少,总会返回空列表。将考虑@a
中的每个元素,但它们都不以s
和n
开头 - 因为这是不可能的。
您想要的是测试@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)
只需匹配以s
或n
开头的任何字词。以下代码将为您提供所需的输出:
my @arr = qw(sonata Samsung sony icic huawie nissan nokia);
my @filter = grep { /^[sn]/i } @arr;
print "@filter \n";
其中^[sn]
将匹配以s
或n
开头的任何字词。
输出:
sonata Samsung sony nissan nokia