2015-11-26 2 views
1

Я пытаюсь найти все элементы массива, начиная с S и N, но приведенный ниже код не делает:Как фильтровать массив по нескольким критериям?

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

вот мой код

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

я использовал @ а = дш (соната Samsung сони ICIC huawie ниссан Nokia); @ filter = grep {/^s (. *) $/Ig} @a; print "@filter \ n"; @ filters = grep {/^n (. *) $/Ig} @a; print "@filters \ n"; @final = (фильтр @ фильтры); print "@final \ n"; –

+0

Вы должны изменить свой вопрос, чтобы добавить этот вид информации, а не комментировать. – Arc676

ответ

5

Вы на правый трек, но вы внесли пробелы в свои регулярные выражения. Вы также запрашиваете случаи, когда строка начинается с символа «S» или символа «N», поэтому ваша логика является оператором OR, а не инструкцией AND, как написано. Если все, о чем вы заботитесь, это первый символ, это все, что вам нужно в вашем шаблоне, и вы хотите использовать логическое ИЛИ.

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

Результат:

sonata Samsung sony nissan nokia 

Edit - или более лаконично с характером класса

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

почему нисходящий? – obscurite

+2

Хороший вопрос ... Вот, у вас есть upvote! –

+0

Большое спасибо @MikeCovington! – obscurite

8

Ваша проблема одна из логики. Вы говорите, что хотите отфильтровать для всех строк, которые «начинаются с 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 "character class" создает новый атом, который соответствует любой из нескольких возможностей. . - это класс символов, а пользовательские классы символов могут быть созданы с помощью угловых скобок, [].

Таким образом:

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

Модификатор 'g' на шаблоне, вероятно, тоже избыточен. – Sobrique

+0

@sobrique True! Закрепление. – darch

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