Ваша проблема одна из логики. Вы говорите, что хотите отфильтровать для всех строк, которые «начинаются с 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;
я использовал @ а = дш (соната Samsung сони ICIC huawie ниссан Nokia); @ filter = grep {/^s (. *) $/Ig} @a; print "@filter \ n"; @ filters = grep {/^n (. *) $/Ig} @a; print "@filters \ n"; @final = (фильтр @ фильтры); print "@final \ n"; –
Вы должны изменить свой вопрос, чтобы добавить этот вид информации, а не комментировать. – Arc676