#string #perl
#строка #perl
Вопрос:
Я хочу преобразовать каждую букву в предложении в определенную букву в зависимости от того, является ли это согласной или гласной, где гласные — это AEIOU.
Итак, если у меня есть строка
$string = 'Hello'
Я хотел бы видеть
$string = 'CVCCV'
В результате.
Я знаю, что могу использовать:
$string =~ s/A/V/
$string =~ s/B/C/
$string =~ s/C/C/
и так далее для проверки и преобразования каждой буквы по отдельности, но наверняка должен быть более эффективный способ сделать это.
Ответ №1:
нормализуйте регистр, затем примените оператор транслитерации:
$string = lc $string;
$string =~ tr/aeioua-z/VVVVVC/;
Ответ №2:
Используйте… s/[bcdfghjklmnpqrstvwxyz]/C/gi
и s/[aeiou]/V/gi
. Они называются символьными классами. i
Флаг делает совпадение нечувствительным к регистру.
Комментарии:
1. Нет проблем. regular-expressions.info это отличный справочник; возможно, он окажется полезным.
2. Всегда есть
y/AEIOU/V/
, хотя я подозреваю, что его дополнениеy/AEIOU/C/c
может быть не совсем тем, что вы искали. Если вы действительно собираетесь использоватьs///
, вы могли бы также использовать регистрозависимый/i
, а?3. Вы пробовали это? 2-й s /// заменит букву «V» из 1-го на «C»s, в итоге вы получите строку, которая полностью состоит из «C»s…
4. Правильным инструментом для этого является оператор транслитерации (tr///), а не оператор подстановки (s ///). Смотрите ответ tadmc.
5. Перечисление согласных менее читаемо, чем перечисление гласных, потому что слишком сложно убедиться, что вы ничего не пропустили. С другой стороны, вы не можете назвать Y согласной ни по какому разумному определению.
Ответ №3:
s/([aeiou])|[a-z]/ defined $1 ? 'V' : 'C' /ieg