Perl, замена строки

#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