Идентификация алфавитных символов
Проблема
Требуется узнать, состоит ли строка только из алфавитных символов.
Решение
Наиболее очевидное решение не подходит для общего случая:
if ($var =~ /^[A-Za-z]+$/) {
# Только алфавитные символы
}
Дело в том, что такой вариант не учитывает локальный контекст пользователя. Если наряду с
обычными должны идентифицироваться символы с диакритическими знаками, воспользуйтесь директивой
use locale и инвертированным символьным классом:
use locale;
if ($var =~ /^\W\d_]+$/) {
print "var is purely alphabetic\n";
}
Комментарий
В Perl понятие «алфавитный символ» тесно связано с локальным контекстом, поэтому нам придется немного
схитрить. Регулярное выражение \w совпадает с одним алфавитным или цифровым символом, а также
символом подчеркивания. Следовательно, \W не является одним из этих символов. Инвертируемый
символьный класс [^\W\d_] определяет байт, который не является алфавитным символом, цифрой или
подчеркиванием. После инвертирования остаются одни алфавитные символы, которые нас и интересуют.
В программе это выглядит так:
use locale;
while (<DATA>) {
chomp;
if (/^[^\W\d_]+$/) {
print "$_: alphabetic\n";
} else {
print "$_: line noise\n";
}
}
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|