![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| DissDoc |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 13.7.2006 Репутация: нет Всего: нет |
Привет всем, разбираюсь с Perl, собственно дошел до регулярных выражений и придумываю себе задачи ).
Сам себе придумал и встрял на таком моменте. Есть предложение, где цифры, символы, пробелы и всякая пунктуация. Так вот все вроде раотает, но не отделяются цифры от букв (( Т.е. если предложение такое te4st 12 ab то, выводи мой скрипт, что найдено 9 букв(( Что я не так делаю?
|
|||
|
||||
| AlexPet |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 5.12.2007 Где: Брянск Репутация: 1 Всего: 1 |
У меня 33 вывел на Вашем примере.
Там небольшая опечатка - Вы пропустили знак $ перед counter, кстати |
|||
|
||||
| DissDoc |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 13.7.2006 Репутация: нет Всего: нет |
Не, не, не
Вот непосредственно в скрипте тоже выводит 33. Именно и буквы и цифры. Я не могу вывести ТОЛЬКО буквы ((( А то что пропустил $ - в скрипте есть ;-) Не в этом дело. Факт что не выводятся только буквы, не отсекаются цифры. |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 2 Всего: 34 |
А так:
|
|||
|
||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
\w матчит буквам, цифрам и нижнему подчеркиванию [a-zA-Z\d_]
Правильный вариант показал Itsys Это сообщение отредактировал(а) KSURi - 17.7.2008, 17:56 -------------------- Died at Life.pl line 21 |
|||
|
||||
| DissDoc |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 13.7.2006 Репутация: нет Всего: нет |
Да, но код Itsys'a возвращает по идеи все буквы, а не их количество.
Я думаю конечно можно подсчитать функцией количество символов, но я больше ориентируюсь на что-то вроде
Правда возвращает мне 1 Это сообщение отредактировал(а) DissDoc - 17.7.2008, 18:45 |
|||
|
||||
| AlexPet |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 5.12.2007 Где: Брянск Репутация: 1 Всего: 1 |
а еще можно применить магию Perl:
возвратит, как и нужно Вам, 27 +) (извиняюсь, я сначала не совсем Вас понял) |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
можно упростить и будет хорошо ;) Добавлено через 7 минут и 42 секунды гы ;) Добавлено через 7 минут и 51 секунду AlexPet, for you! |
|||
|
||||
| DissDoc |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 13.7.2006 Репутация: нет Всего: нет |
Точно, я забыл про замену.
nitr, я писал, что хотел бы отказаться от функций подсчета символов AlexPet, все бы хорошо, но вы похоже путаете оператор связывания и оператор присваивания. Потому что, то что вы написали, вернет скорее всего пустую строку (могу ошибаться). Но собственно я сделал что хотел
Вот теперь вернет 27 )) P.S. эх, мне бы опыту я б горы переворачивал)) |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
DissDoc, он (AlexPet) прав, всё работает
Магия ;) А у вас стандартно, а у него магия ;) |
|||
|
||||
| AlexPet |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 5.12.2007 Где: Брянск Репутация: 1 Всего: 1 |
Можете и ошибаетесь ;) y/x// (равно как и tr/x//) - это операция транслитерации, без второго аргумента - меняет символ 'x' на него же, и возвращает число таких замен => получаем число символов 'x' в строке. Единственная проблема - при отсутствии таких символов будет пустая строка, а не нуль - ну да это легко поправимо ;) Добавлено через 5 минут кстати, недавно размышлял над самым коротким (в плане количества кода) методом подсчета количества вхождений определенного символа в строке. Как раз самое короткое - это через y/x//; следующее - через s/x//g; но в них упомянутая выше проблема с нулем - поэтому как-то не элегантно, если учитывать пограничный случай... |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
# perl -MList::Util=reduce -e 'foreach my $r (qw#alpha alnum punct blank digit space ascii xdigit#) { printf "%s\t%d\n",$r,reduce { $a+$b } map { m/^[[:$r:]]$/ ? 1 : 0 } split "",$ARGV[0]; }' "Hello, guys ))) How 12.8 may be te4st 4 me 7 . \!\! test"
alpha 27 alnum 33 punct 8 blank 18 digit 6 space 18 ascii 59 xdigit 13 # |
|||
|
||||
| IceSunrise |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 7.4.2008 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
AlexPet, спасибо за пример с транслитерацией, никогда не использовал, возможно пригодится
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |