Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подсчет числа цифр и символов 
:(
    Опции темы
DissDoc
Дата 17.7.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Привет всем, разбираюсь с Perl, собственно дошел до регулярных выражений и придумываю себе задачи ).
Сам себе придумал и встрял на таком моменте.
Есть предложение, где цифры, символы, пробелы и всякая пунктуация. Так вот все вроде раотает, но не отделяются цифры от букв (( Т.е. если предложение такое 
te4st 12 ab
то, выводи мой скрипт, что найдено 9 букв(( Что я не так делаю?
Код

my $str = "Hello, guys ))) How 12.8 may    be te4st 4 me  7  . !! test";

print countLetters($str);

sub countLetters {
    my $str = shift();
    my $counter = 0;
    
    while ($str =~ m/(\w{1})/g) { counter++; }
    
    return $counter;
}

PM MAIL WWW   Вверх
AlexPet
Дата 17.7.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



У меня 33 вывел на Вашем примере.
Там небольшая опечатка - Вы пропустили знак $ перед counter, кстати
PM MAIL ICQ Jabber   Вверх
DissDoc
Дата 17.7.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Не, не, не  smile 
Вот непосредственно в скрипте тоже выводит 33. Именно и буквы и цифры. Я не могу вывести ТОЛЬКО буквы (((
А то что пропустил $ - в скрипте есть ;-) Не в этом дело.
Факт что не выводятся только буквы, не отсекаются цифры.
PM MAIL WWW   Вверх
Itsys
Дата 17.7.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



А так:
Код

my $str = "Hello, guys ))) How 12.8 may    be te4st 4 me  7  . !! test";

print countLetters($str);

sub countLetters {
    my $str = shift();
    my $counter = 0;
    
    return ($str =~ m/([a-z])/gi);
}


PM MAIL WWW Skype   Вверх
KSURi
Дата 17.7.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM Jabber   Вверх
DissDoc
Дата 17.7.2008, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Да, но код Itsys'a возвращает по идеи все буквы, а не их количество.
Я думаю конечно можно подсчитать функцией количество символов, но я больше ориентируюсь на что-то вроде
Код

my $matches = $str ~= m/([a-z])/gi;

Правда возвращает мне 1

Это сообщение отредактировал(а) DissDoc - 17.7.2008, 18:45
PM MAIL WWW   Вверх
AlexPet
Дата 17.7.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



а еще можно применить магию Perl:
Код

my $str = "Hello, guys ))) How 12.8 may    be te4st 4 me  7  . !! test";
print $str =~ y/[a-zA-z]//;

возвратит, как и нужно Вам, 27 +)
(извиняюсь, я сначала не совсем Вас понял)
PM MAIL ICQ Jabber   Вверх
nitr
Дата 17.7.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Код
#!perl

my $str = "Hello, guys ))) How 12.8 may    be te4st 4 me  7  . !! test";

print countLetters($str);

sub countLetters {
    my $str = shift();
    
    $str =~ s/[^a-z]//gi;
    return length($str);
}

можно упростить и будет хорошо ;)

Добавлено через 7 минут и 42 секунды
гы ;)

Добавлено через 7 минут и 51 секунду
AlexPet, for you!


--------------------
PM   Вверх
DissDoc
Дата 17.7.2008, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Точно, я забыл про замену.
nitr, я писал, что хотел бы отказаться от функций подсчета символов
AlexPet, все бы хорошо, но вы похоже путаете оператор связывания и оператор присваивания. Потому что, то что вы написали, вернет скорее всего пустую строку (могу ошибаться). Но собственно я сделал что хотел
Код

my $str = "Hello, guys ))) How 12.8 may    be te4st 4 me  7  . !! test";
my $matches = $str =~ s/([a-z])//gi;
print $matches;

Вот теперь вернет 27 ))

P.S. эх, мне бы опыту я б горы переворачивал))
PM MAIL WWW   Вверх
nitr
Дата 17.7.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



DissDoc, он (AlexPet) прав, всё работает smile
Магия ;)

А у вас стандартно, а у него магия ;)


--------------------
PM   Вверх
AlexPet
Дата 17.7.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



Цитата(DissDoc @  17.7.2008,  20:03 Найти цитируемый пост)
AlexPet, все бы хорошо, но вы похоже путаете оператор связывания и оператор присваивания. Потому что, то что вы написали, вернет скорее всего пустую строку (могу ошибаться).

Можете и ошибаетесь ;)
y/x// (равно как и tr/x//) - это операция транслитерации, без второго аргумента - меняет символ 'x' на него же, и возвращает число таких замен => получаем число символов 'x' в строке.
Единственная проблема - при отсутствии таких символов будет пустая строка, а не нуль - ну да это легко поправимо ;)

Добавлено через 5 минут
кстати, недавно размышлял над самым коротким (в плане количества кода) методом подсчета количества вхождений определенного символа в строке. Как раз самое короткое - это через y/x//; следующее - через s/x//g; но в них упомянутая выше проблема с нулем - поэтому как-то не элегантно, если учитывать пограничный случай...
PM MAIL ICQ Jabber   Вверх
arto
Дата 17.7.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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
#
PM MAIL ICQ   Вверх
IceSunrise
Дата 18.7.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: 3
Всего: 3



AlexPet,  спасибо за пример с транслитерацией, никогда не использовал, возможно пригодится smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.