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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посчитать количество вхождения символа с строку, не изменяя эту строку 
:(
    Опции темы
Suppir
Дата 17.10.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



$line = "О перечне объектов культурного наследия"

Как посчитать количество пробелов в строке, не изменяя строку? 


PM MAIL   Вверх
Suppir
Дата 17.10.2010, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вопрос снят:

Код

while($line=~ s/(\s)/$1/g){$c++}
print $c;

PM MAIL   Вверх
Pfailed
Дата 17.10.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Насколько помню в кэмелбуке говорилось, что лучшим вариантом для решения такой задачи является использование tr///
Код

$cnt = $line =~ tr/ / /;


Добавлено через 4 минуты и 54 секунды
Кстати судя по всему когда замена происходит на туже заменяемую букву tr не модифицирует исходную строку. Таким образом можно посчитать количество пробелов даже в анонимной строке.
Код

$cnt =  "О перечне объектов культурного наследия" =~ tr/ / /;




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


Новичок



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

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



Вариант с while зацикливается  smile 
Вариант с tr непозволяет использовать регулярные ...

Вот так работает  my @cifra = $name =~ m!\d!g; в моем случае нужно посчитать цифры.
PM MAIL   Вверх
arto
Дата 3.3.2011, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



#perl -MBenchmark=timethese -e '$aa = join "",map { rand(10)>2 ? "a" : "1" } 1..$ARGV[1]; timethese ($ARGV[0], { A => sub { return scalar split "(?:\\d)",$aa }, B => sub { my @aa = $aa =~ m#\d+#g; return $#aa }, C => sub { my $n; $n++ while ($aa =~ m#\d#g); return $n } } )' 10000 10240   
Benchmark: timing 10000 iterations of A, B, C...
         A:  4 wallclock secs ( 3.82 usr +  0.06 sys =  3.88 CPU) @ 2577.32/s (n=10000)
         B: 14 wallclock secs (13.04 usr +  0.04 sys = 13.08 CPU) @ 764.53/s (n=10000)
         C:  7 wallclock secs ( 7.79 usr +  0.02 sys =  7.81 CPU) @ 1280.41/s (n=10000)

PM MAIL ICQ   Вверх
nagual2
Дата 6.3.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



split hазбивает строку на отдельные строки, используя в качестве разделителя образец, задаваемый регулярным выражением. В случае когда крайний символ удовлетворяет выражению он вернет неверный для нас результат. Скорее как то так sub { return scalar split "(?:\\d)","a".$aa."a" }

Добавлено через 3 минуты и 34 секунды
Исходный тест:
Benchmark: timing 10000 iterations of A, B, C...
         A:  3 wallclock secs ( 3.01 usr +  0.00 sys =  3.01 CPU) @ 3324.68/s (n=10000)
         B: 13 wallclock secs (12.88 usr +  0.00 sys = 12.88 CPU) @ 776.70/s (n=10000)
         C:  7 wallclock secs ( 7.12 usr +  0.00 sys =  7.12 CPU) @ 1405.05/s (n=10000)

Исправленный:
Benchmark: timing 10000 iterations of A, B, C...
         A:  4 wallclock secs ( 3.19 usr +  0.00 sys =  3.19 CPU) @ 3137.25/s (n=10000)
         B: 13 wallclock secs (13.21 usr +  0.00 sys = 13.21 CPU) @ 756.95/s (n=10000)
         C:  8 wallclock secs ( 7.59 usr +  0.00 sys =  7.59 CPU) @ 1316.87/s (n=10000)

PM MAIL   Вверх
gcc
Дата 6.3.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



если бы задача была не такая легкая, то можно было бы связывать с xor

например,  вариант amg
Код

    $hash->{$1}++
      while $_[0] =~ /(\d+\.\d+\.\d+\.\d+)/smg xor 
         grep { $_ > 255 } split /\./,
        $1;


ускоряет довольно сильно

Это сообщение отредактировал(а) gcc - 6.3.2011, 15:19
PM WWW ICQ Skype GTalk Jabber   Вверх
nagual2
Дата 6.3.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 split /\./, А если точка будет стоять в начале строки или в конце то результат будет неверный ...
PM MAIL   Вверх
gcc
Дата 6.3.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



результат чего?
попробовать религия запрещает?

Код

perl -MData::Dumper -e ' $hash->{$1}++ while ".193.201.81.81. .193.201.81.81." =~ /(\d+\.\d+\.\d+\.\d+)/smg xor grep { $_ > 255 } split /\./, $1; print Dumper $hash'


Это сообщение отредактировал(а) gcc - 6.3.2011, 15:59
PM WWW ICQ Skype GTalk Jabber   Вверх
nagual2
  Дата 6.3.2011, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Автор темы хотел посчитать пробелы. Мне нужно было посчитать точки. В тесте с ip сам ip выдает верно, но условие задачи немного другое.

Добавлено через 2 минуты и 15 секунд
split считает слева направо, если первый символ строки подходит под условие то в выдаваемом результате в массиве первый элемент будет пустой ...
PM MAIL   Вверх
KSURi
Дата 9.3.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

my $count =()= $text =~ /[ .]/g; # secret goatse operator



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
nagual2
Дата 9.3.2011, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



perl -MBenchmark=timethese -e '    $aa = join "",map { rand(10)>2 ? "a" : "1" } 1..$ARGV[1];     timethese ($ARGV[0], { A => sub { return scalar split "(?:\\d)","a".$aa."a" }, B => sub
 { my @aa = $aa =~ m#\d+#g; return $#aa }, C => sub { my $n; $n++ while ($aa =~ m#\d#g); return $n }, D => sub { my $n =()= $aa =~ /[ .]/g; return $n }} )' 10000 10240


# ./test.sh
Benchmark: timing 10000 iterations of A, B, C, D...
         A:  4 wallclock secs ( 3.06 usr +  0.00 sys =  3.06 CPU) @ 3265.31/s (n=10000)
         B: 13 wallclock secs (12.87 usr +  0.00 sys = 12.87 CPU) @ 777.17/s (n=10000)
         C:  7 wallclock secs ( 7.12 usr +  0.00 sys =  7.12 CPU) @ 1405.05/s (n=10000)
         D:  0 wallclock secs ( 0.34 usr +  0.00 sys =  0.34 CPU) @ 29767.44/s (n=10000)
            (warning: too few iterations for a reliable count)

Я где то ошибся в тесте ?

perl -MBenchmark=timethese -e '    $aa = join "",map { rand(10)>2 ? "a" : "1" } 1..$ARGV[1];     timethese ($ARGV[0], { A => sub { return scalar split "(?:\\d)","a".$aa."a" }, B => sub
 { my @aa = $aa =~ m#\d+#g; return $#aa }, C => sub { my $n; $n++ while ($aa =~ m#\d#g); return $n }, D => sub { my $n =()= $aa =~ /\./g; return $n }} )' 10000 10240

# ./test.sh
Benchmark: timing 10000 iterations of A, B, C, D...
         A:  4 wallclock secs ( 3.13 usr +  0.00 sys =  3.13 CPU) @ 3192.02/s (n=10000)
         B: 13 wallclock secs (12.98 usr +  0.00 sys = 12.98 CPU) @ 770.62/s (n=10000)
         C:  8 wallclock secs ( 7.95 usr +  0.00 sys =  7.95 CPU) @ 1257.37/s (n=10000)
         D:  0 wallclock secs ( 0.08 usr +  0.00 sys =  0.08 CPU) @ 128000.00/s (n=10000)
            (warning: too few iterations for a reliable count)


Это сообщение отредактировал(а) nagual2 - 9.3.2011, 16:05
PM MAIL   Вверх
arto
Дата 9.3.2011, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



да. в варианте D вы ищете что-то непонятное.
остальные ищут числа.
PM MAIL ICQ   Вверх
nagual2
Дата 9.3.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



perl -MBenchmark=timethese -e '    $aa = join "",map { rand(10)>2 ? "a" : "1" } 1..$ARGV[1];     timethese ($ARGV[0], { A => sub { return scalar split "(?:\\d)","a".$aa."a" }, B => sub
 { my @aa = $aa =~ m#\d+#g; return $#aa }, C => sub { my $n; $n++ while ($aa =~ m#\d#g); return $n }, D => sub { my $n =()= $aa =~ /\d/g; return $n }} )' 10000 10240

./test.sh
Benchmark: timing 10000 iterations of A, B, C, D...
         A:  3 wallclock secs ( 3.24 usr +  0.00 sys =  3.24 CPU) @ 3084.34/s (n=10000)
         B: 13 wallclock secs (13.42 usr +  0.00 sys = 13.42 CPU) @ 745.05/s (n=10000)
         C:  9 wallclock secs ( 8.27 usr +  0.00 sys =  8.27 CPU) @ 1208.69/s (n=10000)
         D: 12 wallclock secs (12.09 usr +  0.00 sys = 12.09 CPU) @ 826.87/s (n=10000)

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


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

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


 




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


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

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