Добрый день!Есть такая проблема.
Надо обрабатывать записи с телефонными номерами, приводя их к виду:
если номер начинается с 7, то заменить 7 на 98
иначе
дописать номер к 9810.Т.е., примерно так:
if($phone =~ /^7/)
{
$phone = =~ s/^[7]/98/;
}
else
{
$phone = "9810".$phone;
}Возможно ли данную процедуру реализовать через одно единственное регулярное выражение с условием?
Спасибо.
Откройте для себя встроенную переменную "$_"
Можно загнать ветвление внутрь s/// прямо:
s/^(7?)/$1==7 ? "98" : "9810"/e;Или более извращённо:
$n="10"; s/^(7(?{$n=""}))?/98$n/;А можно и двумя операторами:
s/^(?!7)/9810/; s/^7/98/;По-моему так проще.
#!/usr/bin/perl$phone=(<>);
$phone=~s/^(\d)(\d*)/if($1==7){"98$2"}else{"9810$1$2"}/e;
print $phone;Тьфу! Это же вид сбоку всем известного предмета предыдущего варианта. Тупо проглядел.))
> #!/usr/bin/perl
> if($1==7){"98$2"}else{"9810$1$2"}
> Тьфу! Это же вид сбоку всем известного предмета предыдущегоУ меня глаза болят на ваши примеры. Про перл помолчу, но "98" могли бы за "скобки" if вынести. Как и $2.
"98"if($1!=7){"10$1"}"$2" ?
>> #!/usr/bin/perl
>> if($1==7){"98$2"}else{"9810$1$2"}
>> Тьфу! Это же вид сбоку всем известного предмета предыдущего
> У меня глаза болят на ваши примеры. Про перл помолчу, но "98"
> могли бы за "скобки" if вынести. Как и $2.
> "98"if($1!=7){"10$1"}"$2" ?XAnder с тернарным условным оператором уже всё сказал.
И другие его примеры не хуже.
>>> #!/usr/bin/perl
>>> if($1==7){"98$2"}else{"9810$1$2"}
>>> Тьфу! Это же вид сбоку всем известного предмета предыдущего
>> У меня глаза болят на ваши примеры. Про перл помолчу, но "98"
>> могли бы за "скобки" if вынести. Как и $2.
>> "98"if($1!=7){"10$1"}"$2" ?Стесняюсь спросить, а нафига для этой задачи тернарные операторы и условия в regex вообще?
$phone = "9810".$phone;
$phone =~ s/^98107/98/;
Или на Perl:$phone = '9810'.$phone unless $phone =~ s/^7/98/;
>[оверквотинг удален]
>>>> Тьфу! Это же вид сбоку всем известного предмета предыдущего
>>> У меня глаза болят на ваши примеры. Про перл помолчу, но "98"
>>> могли бы за "скобки" if вынести. Как и $2.
>>> "98"if($1!=7){"10$1"}"$2" ?
> Стесняюсь спросить, а нафига для этой задачи тернарные операторы и условия в
> regex вообще?
> $phone = "9810".$phone;
> $phone =~ s/^98107/98/;
> Или на Perl:
> $phone = '9810'.$phone unless $phone =~ s/^7/98/;Не стесняйся!))
Ну что тут скажешь? Класс! Аплодисменты, переходящие в овации. Занавес!?
> Стесняюсь спросить, а нафига для этой задачи тернарные операторы и условия в
> regex вообще?
> $phone = "9810".$phone;
> $phone =~ s/^98107/98/;
> Или на Perl:
> $phone = '9810'.$phone unless $phone =~ s/^7/98/;Свежо! Но это всё (у всех, кто здесь что-либо предложил) разные варианты реализации одной и той же идеи. Выбор операторов - дело десятое, а условия всегда есть, поскольку рег. выражения, по сути, из них и состоят.
Я вот жду, не предложит ли кто-нибудь решение _только единственным_ s/// без вставок кода через /e или (?{}). Думаю, что такое решение или не существует, или слишком громоздко. Практической пользы тут нет, но почему бы и не порешать в качестве "гимнастики ума"?
>> $phone = "9810".$phone;
>> $phone =~ s/^98107/98/;
>> Или на Perl:
>> $phone = '9810'.$phone unless $phone =~ s/^7/98/;
> Я вот жду, не предложит ли кто-нибудь решение _только единственным_ s/// без
> вставок кода через /e или (?{}). Думаю, что такое решение илиИ где здесь /e или (?{}) ?
> И где здесь /e или (?{}) ?Да я не о том. "/e или (?{})" - это _примеры_ того, как можно вставить код внутрь s///. Разумеется, код можно оставить и снаружи, как у вас. Не в этом дело. Хочется понять, есть ли решение "_только единственным_ s///", 1 шт., без чего-либо другого.
PS. Я не ищу здесь ни практического применения, ни глубинного смысла. Просто интересно.
> снаружи, как у вас. Не в этом дело. Хочется понять, есть
> ли решение "_только единственным_ s///", 1 шт., без чего-либо другого.А, это ты про теорему Гёделя. Нет, не решается. Её же и смотри.
> А, это ты про теорему Гёделя. Нет, не решается. Её же и
> смотри.Гёделя, говоришь? "Я сам, брат, из этих."
s/^(?=([^7])|7)7?/98$+[1]$-[1]/;Читерство, конечно, и use warnings ругается, но условия соблюдены :-) "Нация удовлетворена!"
>> А, это ты про теорему Гёделя. Нет, не решается. Её же и
>> смотри.
> Гёделя, говоришь? "Я сам, брат, из этих."
>s/^(?=([^7])|7)7?/98$+[1]$-[1]/;
> Читерство, конечно, и use warnings ругается, но условия соблюдены :-) "НацияМожно вообще подсунуть regex, который переполнит буфер и исполнит произвольный код. Без /e и (?{}). Условия соблюдены.
"Читерство" и есть "выход за рамки системы". Гёдель - он такой, на кривой его не объедешь.
Огромное спасибо всем уделившим внимание и время!
Вариант предложенный XAnder'ом более чем мне помог, ему отдельное огромное человеческое спасибо.
Можно сказать дело закрыто. С Вашей помощью.