Форум программистов, компьютерный форум, киберфорум
Perl
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 2

Есть ли лучшая альтернатива решения задачи?

28.01.2015, 15:47. Показов 914. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть строка формата :
005555,0 ,000000,000,09,22204545000 ,33363837355 ,33365765574 , ,00,28012015075753,28012017097542,280120 157937742....

которая передается в переменной $b и после обрезания сравнивается с выделенной красной частью, и так каждая строка с файла.
...
if (substr($b,64,3) eq '333')
...

Вопрос: можно ли реализовать это по другому (лучше)?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2015, 15:47
Ответы с готовыми решениями:

Есть ли короткий путь решения задачи?
Даны три действительных числа. Возвести в квадрат те из них, значения которых неотрицательны. Есть ли ещё более короткий путь решения...

Есть ли какой паттерн для решения подобной задачи?
у меня есть абстрактный класс, для фигур. он имеет метод для записи в файл, который переопределяет все потомки. а как реализовать метод для...

Есть ли более простой и оптимальный способ решения данной задачи?
Добрый день! Ситуация следующая: Есть класс Event. public class Event { public string Name { get; set; } public...

12
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
28.01.2015, 16:01
лучше чем что? по скорости substr быстрее регулярного выражения.

Добавлено через 8 минут
и если задача состоит в проверке символов, с 64-го по 67-й, то лучше и не придумать.

вот разве что ещё unpack сравним по скорости.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.02.2015, 01:54
Вряд ли. pack/unpack для работы с двоичными структурами.
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
01.02.2015, 02:42
TC всё равно исчез ( похитили? ),
поэтому можно, конечно, поспорить на эту тему,
но жаркой дискуссии не получится,
потому что и в популярных книжках с картинками,
и в сухой документации написано, как использовать
pack / unpack для работы с текстом.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.02.2015, 14:10
volodin661, с текстом или с последовательностью байт?
Perl
1
2
3
my $str = '005555,0 ,000000,000,09,22204545000 ,33363837355 ,33365765574 , ,00,28012015075753,28012017097542,280120157937742';
my (undef, $val) = unpack "A[37]A[3]", $str;
say $val;
Сравнимо с забиванием гвоздей микроскопом.
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
01.02.2015, 15:43
вот так - забивание гвоздя молотком:
Perl
1
perl -E '$_="005555,0 ,000000,000,09,22204545000 ,3336"; if(substr($_,37,3) eq "333") { say "OK"}'
а вот так микроскопом?
Perl
1
perl -E '$_="005555,0 ,000000,000,09,22204545000 ,3336"; if((unpack"A37A3")[1] eq "333") { say "OK"}'
учитывая, что unpack быстрее substr



Code
1
2
3
4
5
6
7
8
9
10
а если предположить, что надо было 4-5 подстрок разной длины  вытянуть из фиксированных колонок:
 
$line = "1 00555,00;98;7823414;74646;228,27272.26262.fffe;343567;9876;ABC";
             ^              ^                        ^                ^
-------------               |                        |                |
-----------------------------                        |                |
-----------------------------------------------------                 |
-----------------------------------------------------------------------
 
смещение/длина: 4/3, 30/2, 54/3, 72/2
молоток?
Perl
1
2
3
4
my $col1 = substr( $line, 4,  3 );
my $col2 = substr( $line, 30, 2 );
my $col3 = substr( $line, 54, 3 );
my $col4 = substr( $line, 72, 2 );
майкроскоп?
Perl
1
 my @cols = (unpack("A4A3 A23A2 A23A3 A15A2", $line))[1,3,5,7];
1
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 2
01.02.2015, 18:59  [ТС]
ТС не исчез, просто выходные Спасибо за примеры. Но все же если unpack работает быстрее и мне как раз это нужно, в чем минус реализации ''забиванием гвоздя микроскопом"?
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.02.2015, 23:06
Цитата Сообщение от volodin661 Посмотреть сообщение
учитывая, что unpack быстрее substr
По моим тестам наоборот.
Цитата Сообщение от volodin661 Посмотреть сообщение
а если предположить, что надо было 4-5 подстрок разной длины вытянуть из фиксированных колонок:
Человек предполагает, а Бог располагает. Давайте не будем строить предположения.
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
02.02.2015, 12:54
оставь бога в покое, ему сейчас есть чем заняться;

подобный benchmark есть в stackoverflow (http://stackoverflow.com/quest... han-substr)
проверил и сам, подтвердилось:

сам по себе ( в void контексте ) unpack быстрее, но на присвоении результата ( копировании строк )
теряет очень много, поэтому в конечном итоге ( на моем примере конкретно ) получается в 2-4 раза медленнее.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
02.02.2015, 13:26
Цитата Сообщение от volodin661 Посмотреть сообщение
получается в 2-4 раза медленнее.
что и требовалось доказать.

Добавлено через 24 минуты
О том, что тестировать в void контексте некорректно написано во втором посте.

Забавно, что при конфигурации
Code
1
This is perl 5, version 14, subversion 2 (v5.14.2) built for i486-linux-gnu-thread-multi-64int
В void контексте получил
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
           Rate substr unpack
substr 830875/s     --   -13%
unpack 955733/s    15%     --
100
           Rate substr unpack
substr  98248/s     --    -8%
unpack 107325/s     9%     --
1000
          Rate substr unpack
substr 10048/s     --    -9%
unpack 11060/s    10%     --
10000
         Rate substr unpack
substr 1004/s     --    -9%
unpack 1104/s    10%     --
100000
        Rate substr unpack
substr 100/s     --    -9%
unpack 110/s    10%     --
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
02.02.2015, 15:50
С Юникодом и большим числом извлечений

Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use utf8;
use strict;
use warnings;
use Benchmark;
 
#количество колонок для извлечения
my $NN = shift || 5000;
 
my $str = "ФЫВ#" x $NN;
my @cols;
 
 
my $format = "A3A1" x $NN;
 
my @indexes;
 
for( my($n,$k)=(0,0); $n<$NN; $n+=1, $k+=2 ) {
        push @indexes, $k;
}
 
my %methods = (
    unpack  => sub {
 
                @cols = (unpack $format, $str)[@indexes];
            return \@cols;
        },
 
    substr => sub {
            for( my($n,$k)=(0,0); $n<$NN; ++$n, $k+=4 ) {
                    $cols[$n] = substr( $str, $k, 3);
            }
            return \@cols;
        }
);
 
print $NN;
 
Benchmark::cmpthese -1, \%methods;
Benchmark::timethese -1, \%methods;
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
10000
         Rate substr unpack
substr 8.62/s     --   -95%
unpack  181/s  1997%     --
Benchmark: 
running
 substr, unpack
 for at least 1 CPU seconds
...
 
    substr:  1 wallclock secs ( 1.04 usr +  0.00 sys =  1.04 CPU) @  8.65/s (n=9)
 
    unpack:  1 wallclock secs ( 1.09 usr +  0.00 sys =  1.09 CPU) @ 180.73/s (n=197)
1C
1
2
на 10 000 извлечений unpack выигрывает с преимуществом в 20 раз 
на 1-ом извлечении проигрывает в 2 раза
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
02.02.2015, 16:18
volodin661, а теперь уже подменяете задачу. Исходная задача ставилась выдрать значение из середины строки, а не распаковать данные!
Юникод или Utf8?
Для utf8 такой формат A3A1 некорректный, размер символа от 1 до 6 байт;
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
02.02.2015, 16:45
Задачу я не подменяю, все про задачу ТС я написал в своем первом посте,
дальнейшее обсуждение идет по поводу сравнения скорости substr и unpack
в различных случаях;
один из таких гипотетических случаев, а именно множественное
извлечение из одной строки, я снабдил тестом по скорости и привел его здесь.

что-то осталось непонятно ?

А про юникод и unpack все написано в документации, на другие источники я и не ссылаюсь.

Так вот, Perl - это не PHP, поэтому заявленная поддержка юникода там реализована прозрачно во всех
функциях и если я пишу формат "A" при режиме use utf8, то это означает именно character mode,
а не byte mode и будет работать вне зависимости от физически выделенных байт

Bash
1
perl -Mutf8 -CS -E 'say "АЯ"' |  perl -CS -ne 'printf "%v04X\n", $_ for unpack("A*", $_)'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2015, 16:45
Помогаю со студенческими работами здесь

Сделать алгоритм решения задачи (описание), есть программа и блок схема
Program abc; var a:array of integer; i,temp,change:integer; begin randomize; writeln(‘исходный массив’); for i:=1 to 20 do ...

Кригинг - есть ли библиотеки для решения данной задачи за более "быстрое" время
Реализован кригинг, но решается за длительное время, особенно в 3d-пространстве. Есть ли библиотеки для решения данной задачи за быстрое...

GETS: есть ли альтернатива?
Ходят слухи, что функция get опасна (кому интересно, эта тема есть на форуме, чуть раньше). Есть ли какая-то функция, которая так же...

Есть ли альтернатива Compiz?
Доброго дня всем! собственно вопрос: установлен Debian 7.1 x64 (Xfce) , есть ли какая замена Compizu? в виду &quot;смерти&quot; последнего,...

Есть ли альтернатива фреймам
При создании сайта возникла следующая проблема - страница разбита на три фрейма. 1 - заголовок. 2 - меню. 3 - Содержимое. Так вот проблема...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru