Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Скриптовые языки программирования > Perl
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 24.09.2020, 12:05   #1
AgentZoy
Новичок
Джуниор
 
Регистрация: 24.09.2020
Сообщений: 2
Злость Помогите изменить код

Привет!
Я не знаю со всем языка Perl
Знакомый написал код под одну задачу, но я забыл один момент Теперь не могу допроситься его чтобы помог
Что делает скрипт
На входе есть данные
Код:
[{"target": "AA", "datapoints": [[null, 1600937680], [0.0, 1600937690], [0.0, 1600937700], [0.0, 1600937710], [null, 1600937720], [null, 1600937730]]}, {"target": "AAPL", "datapoints": [[null, 1600937680], [0.0, 1600937690], [0.0, 1600937700], [null, 1600937710], [null, 1600937720], [null, 1600937730]]}, {"target": "AIG", "datapoints": [[null, 1600937680], [0.0, 1600937690], [0.0, 1600937700], [0.0, 1600937710], [null, 1600937720], [null, 1600937730]]}, {"target": "AMZN", "datapoints": [[null, 1600937680], [0.0, 1600937690], [0.0, 1600937700], [0.0, 1600937710], [null, 1600937720], [null, 1600937730]]}, {"target": "AUDCAD", "datapoints": [[null, 1600937680], [0.0, 1600937690], [0.0, 1600937700], [0.0, 1600937710], [null, 1600937720], [null, 1600937730]]}, {"target": "AUDCAD_v", "datapoints": [[null, 1600937680], [1.0, 1600937690], [1.0, 1600937700], [1.0, 1600937710], [null, 1600937720], [null, 1600937730]]}, {"target": "AUDCHF", "datapoints": [[null, 1600937680], [0.0, 1600937690], [0.0, 1600937700], [null, 1600937710], [null, 1600937720], [null, 1600937730]]},
Что делает скрипт
Скрипт ищет значения таргета у которого первые значения null либо 0.0
Например в приере это AA
1600937680 - это временная метка и она не учитывается
Также скрипт позволяет исключить таргеты из результата например если период времени с 10 - 11 то исключать например AA
$time_period{"21,22,23"} = "USDHKD"; Это означает период времени с 21 до 23 исключить из результата таргет USDHKD

Но я не учел то что период времени может быть например с 21:30 до 23 то есть минуты

Помогите изменить код чтобы в переменную time period можно было задавать время с минутами
Тут и регулярки и хеши Для меня очень сложно написано а так все работает как надо

Вот полный код

Код:

#!/usr/bin/perl

my %time_period = ();
$time_period{"00,01,02,03,04,05,06,07,08,09,10,11,12,13,'14:30',22,23"} = "AA,AIG,AXP,BA,BAC,C,CAT,CSCO,CVX,DD,DIS,GE,HD,HON,JP,JNJ,JPM,KO,MCD,MMM,MO,MRK,PFE,PG,TRV,UTX,VZ,WMT,AAPL,AMZN,BABA,FB,GOOG,MTSC,PTR,SHI,TSLA,HPQ,IBM,INTC,MSFT,T,XOM";
$time_period{"21,22,23"} = "USDHKD";

my @data = ();
my @main_array = ();

fill_data();
fill_main_array();
remove_zero_values();

foreach my $arg (@main_array) {
    if ($arg =~ m{(\[null\,temp\]\,?){6}}) {
	$arg =~ m{^\"target\":\"(\w+)\"};
	my $zero_name = $1;
	print "\"$zero_name\" contains zero value!!!\n";
    }
}

exit 0;

sub fill_data {
    foreach my $arg (<STDIN>) {
	trim ($arg);
	push @data, $arg;
    }
}

sub fill_main_array {
    foreach my $arg (@data) {
	$arg = trim ($arg);
	$arg =~ s|\}\,\s\{|\n|g;
	my @tmp = split ("\n", $arg);
	foreach my $str (@tmp) {
	    $str =~ s|^\[\{||g;
	    $str =~ s|\}\]$||g;
	    $str =~ s|\[0\,|[null,|g;
	    $str =~ s|\[0\.0\,|[null,|g;
	    $str =~ s|\s\d+\]| temp]|g;
	    $str =~ s|\s||g;
	    $str =~ m{datapoints};
	    push @main_array, $str;
	}
    }
}

sub remove_zero_values {
    foreach my $key (keys %time_period) {
	my $value = $time_period{$key};
	my @key_array = split(/,/, $key);
	my @value_array = split(/,/, $value);
	foreach my $arg (@key_array) {
	    if ($arg == get_hours()) {
		foreach my $val (@value_array) {
		    remove_from_list($val);
		}
	    }
	}
    }
}

sub remove_from_list {
    my $val = shift;
    my @new_list = ();
    foreach my $arg (@main_array) {
	$arg =~ m{^\"target\":\"(\w+)\"};
	$val_from_string = $1;
	if ($val ne $val_from_string) {
	    push @new_list, $arg;
	}
    }
    @main_array = @new_list;
}

sub get_hours {
    my $time_string = trim (qx (date));
    $time_string =~ m{(\d\d):\d\d:\d\d};
    return $1;
}

sub trim {
    my $arg = shift;
    $arg =~ s|^[\s\t]+||g;
    $arg =~ s|[\s\t]+$||g;
    $arg =~ s|\n||g;
    return $arg;
}
AgentZoy вне форума Ответить с цитированием
Старый 24.09.2020, 15:34   #2
AgentZoy
Новичок
Джуниор
 
Регистрация: 24.09.2020
Сообщений: 2
По умолчанию

Все задача решена
AgentZoy вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HTML код AlanRaf2101 Общие вопросы по программированию, компьютерный форум 2 28.09.2020 21:39
Помогите пожалуйста написать простой код на C++ Вантус-МС Помощь студентам 3 14.09.2020 12:43
Помогите изменить код Екатерина_________ Помощь студентам 0 05.06.2020 13:16
Помогите изменить код(он работает, но нужно изменить) Programmer_1 Помощь студентам 4 17.09.2018 20:05
Помогите изменить *.exe nada2001 Безопасность, Шифрование 1 24.09.2008 16:40


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840