![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
$line = "О перечне объектов культурного наследия"
Как посчитать количество пробелов в строке, не изменяя строку? |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Вопрос снят:
|
|||
|
||||
Pfailed |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Насколько помню в кэмелбуке говорилось, что лучшим вариантом для решения такой задачи является использование tr///
Добавлено через 4 минуты и 54 секунды Кстати судя по всему когда замена происходит на туже заменяемую букву tr не модифицирует исходную строку. Таким образом можно посчитать количество пробелов даже в анонимной строке.
|
||||
|
|||||
nagual2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.6.2009 Репутация: нет Всего: нет |
Вариант с while зацикливается
![]() Вариант с tr непозволяет использовать регулярные ... Вот так работает my @cifra = $name =~ m!\d!g; в моем случае нужно посчитать цифры. |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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) |
|||
|
||||
nagual2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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) |
|||
|
||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
если бы задача была не такая легкая, то можно было бы связывать с xor
например, вариант amg
ускоряет довольно сильно Это сообщение отредактировал(а) gcc - 6.3.2011, 15:19 |
|||
|
||||
nagual2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.6.2009 Репутация: нет Всего: нет |
split /\./, А если точка будет стоять в начале строки или в конце то результат будет неверный ...
|
|||
|
||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
результат чего?
попробовать религия запрещает?
Это сообщение отредактировал(а) gcc - 6.3.2011, 15:59 |
|||
|
||||
nagual2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.6.2009 Репутация: нет Всего: нет |
Автор темы хотел посчитать пробелы. Мне нужно было посчитать точки. В тесте с ip сам ip выдает верно, но условие задачи немного другое.
Добавлено через 2 минуты и 15 секунд split считает слева направо, если первый символ строки подходит под условие то в выдаваемом результате в массиве первый элемент будет пустой ... |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
-------------------- Died at Life.pl line 21 |
|||
|
||||
nagual2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
да. в варианте D вы ищете что-то непонятное.
остальные ищут числа. |
|||
|
||||
nagual2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |