Perl 如何根据多个条件筛选数组?

Perl 如何根据多个条件筛选数组?,perl,perl-module,Perl,Perl Module,我正在尝试查找所有以S和N开头的数组元素,但下面的代码没有这样做: @a = qw(sonata Samsung sony icic huawie nissan nokia); 这是我的密码 @filter = grep { (/^s (.*)$/ig) && (/^n(.*)$/ig) } @a; print "@filter \n"; 你的思路是对的,但是你已经在正则表达式中引入了空格。您还询问字符串以字符“S”或字符“N”开头的情况,因此您的逻辑是or语句,而不是编写的

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

@a = qw(sonata Samsung sony icic huawie nissan nokia);
这是我的密码

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

你的思路是对的,但是你已经在正则表达式中引入了空格。您还询问字符串以字符“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";

你的思路是对的,但是你已经在正则表达式中引入了空格。您还询问字符串以字符“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";

你的问题是逻辑问题。您说要筛选以S和N开头的所有字符串,但事实并非如此。您需要所有以S或N中的一个开头的字符串

对于以S和N开头的字符串,其第一个字符必须是S,也必须是N,这是不可能的

表情

grep { (/^s (.*)$/ig) and (/^n(.*)$/ig) } @a;
将始终返回空列表,无论@a的值是什么。@a中的每个元素都将被考虑,但没有一个元素同时以s和n开头,因为这是不可能的

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

grep { (/^s (.*)$/ig) or (/^n(.*)$/ig) } @a;
然而,想要匹配多种可能性实际上是一种非常普遍的需求,因此有一种特殊的符号来表示。A创建了一个新的原子,它与多种可能性中的任何一种相匹配。是字符类,可以使用尖括号[]创建自定义字符类

因此:


你的问题是逻辑问题。您说要筛选以S和N开头的所有字符串,但事实并非如此。您需要所有以S或N中的一个开头的字符串

对于以S和N开头的字符串,其第一个字符必须是S,也必须是N,这是不可能的

表情

grep { (/^s (.*)$/ig) and (/^n(.*)$/ig) } @a;
将始终返回空列表,无论@a的值是什么。@a中的每个元素都将被考虑,但没有一个元素同时以s和n开头,因为这是不可能的

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

grep { (/^s (.*)$/ig) or (/^n(.*)$/ig) } @a;
然而,想要匹配多种可能性实际上是一种非常普遍的需求,因此有一种特殊的符号来表示。A创建了一个新的原子,它与多种可能性中的任何一种相匹配。是字符类,可以使用尖括号[]创建自定义字符类

因此:


只要匹配任何以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

只要匹配任何以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

我用过@a=qwsonata三星索尼icic华威日产诺基亚@filter=grep{/^s.*$/ig}@a;打印@filter\n@filters=grep{/^n.$/ig}@a;打印@filters\n@最终=@过滤器,@过滤器;打印@final\n;你应该用你的问题来添加这类信息,而不是评论@filter=grep{/^s.*$/ig}@a;打印@filter\n@filters=grep{/^n.$/ig}@a;打印@filters\n@最终=@过滤器,@过滤器;打印@final\n;你应该用你的问题来添加此类信息,而不是评论。非常感谢@MikeCovington!反对票是因为没有回答实际问题。我不认为不解决&&问题的答案是有用的。我明白你的意思,但OP要求的逻辑是匹配S或N,而不是S和N,即使它最初写的是S和N-OP意味着S或NIt会大大改进你的答案,如果你真的这么说,因为这是OP问题的根源。当“以S和N开头”的核心问题永远不会匹配时,空格实际上是一个次要问题,因为它不能匹配。@Sobrique,我已经添加了这一解释。好主意。非常感谢@MikeCovington!反对票是因为没有回答实际问题。我不认为不解决&&问题的答案是有用的。我明白你的意思,但OP要求的逻辑是匹配S或N,而不是S和N,即使它最初写的是S和N-OP意味着S或NIt会大大改进你的答案,如果你真的这么说,因为这是OP问题的根源。当核心问题为
f'以S开头,N'永远不会匹配,因为它不能匹配。@Sobrique,我补充了这一解释。好主意。图案上的g修饰符在这里可能也是多余的。@sobrique True!在图案上固定.g修饰符在这里可能也是多余的。@sobrique True!修理。