[SP-pm] Perl e horário de verão

Bruno Buss bruno.buss at gmail.com
Fri Feb 28 08:31:23 PST 2014


Oi Geraldo,

Respostas inline :-)


2014-02-28 11:59 GMT-03:00 Geraldo Netto <geraldonetto at gmail.com>:

> Bom Dia Pessoal!
>
> Consegui evoluir no código com a api do posix mesmo
> crio as datas com POSIX::strftime
> e calculo o horário de verão pegando a saida do comando cal no shell
>
> yep, eu sei que é feito, mas resolve o meu problema de um jeito rápido...
> por hora, a idéia é só gerar o "okay" da gerencia p/ matar umas 4
> versões shell que fazem o mesmo trabalho, mas precisam de alguns
> parâmetros diferentes e alguma intervenção humana especificamente no
> período de horário de verão
>

Thumbs up por resolver o problema! :D

Entretanto, o que a galera quer passar aqui, e' que mesmo que você
realmente acredite que esta resolvendo seu problema de forma simples e
rápida agora... não esta'. Ou melhor, o jeito rápido agora *provavelmente*
ira' te causar uma baita dor de cabeça soon(tm).

Tente utilizar o DateTime, e' uma solução ordens de grandeza melhor e não
e' tao difícil assim :-)


>
> a minha dúvida é primária, suponho...
> mas eu não entendi o porque usar o shift
> se eu posso verificar com o defined() se o @_[<número>] está definido?
>

O shift serve para voce retirar e retornar o 1o elemento da lista de
argumentos/parâmetros que foi passada para sua função.

E' uma das formas idiomáticas de se fazer isso, a outra seria "my ($v_a,
$v_b, $v_c) = @_;".
Pessoalmente prefiro com shift :-)


>
> Aceito sugestões e Mais uma vez, Valeu mesmo pela força! :P
>
>
> BTW, código todo a seguir:
>
> #!/usr/bin/perl
>
> use strict;
> use warnings;
>
> use POSIX;
>
>
> # a inicia a data em 1900 entao, se for passado 95 => 1995
> sub calcularDeslocamentoAno {
>     die "ano invalido" unless defined(@_[0]) && return ($_[0] > 99 ?
> $_[0] - 1900 : $_[0]);
> }
>

Então para você o ano 50 e' o mesmo que o ano 1950? :P
Ou se eu passar para você o ano 1800, ele retorna -100.

Outra coisa, você realmente não precisa colocar o return na mesma linha do
die...
Por exemplo:

sub calcularDeslocamentoAno{
    my $ano = shift;

    #Rejeitando coisas que nossa funcao nao sabe tratar.
    die "ano invalido" unless defined $ano && $ano >= 1900;

    return $ano - 1900;
}


>
> sub criarData {
>     die "parametros invalidos" unless (defined(@_[0]) &&
> defined(@_[1]) && defined(@_[2]));
>     #Usage: POSIX::strftime(fmt,             sec, min, hour, mday,
> mon, year, wday = -1, yday = -1, isdst = -1)
>     return POSIX::strftime("%Y,%m,%d", 0, 0, 0, @_[0], (@_[1] -1),
> &calcularDeslocamentoAno(@_[2]), 0, 0);
> }
>

Idealmente você estaria tratando:
* Se o 1o parâmetro e' um dia que esta' no mês (posso tentar usar stftime
passando o dia 31 de Fev?)
* Se o 1o parâmetro e' um dia valido at all (dia igual a 44 por exemplo).
* Lembrar que o dia e o mês são 0-based, ou seja Janeiro => 0, Fev => 1,
etc.
...

Voce tambem poderia fazer:
sub criarData {
    my ($dia, $mes, $ano) = @_;
    die "parametros invalidos" unless defined $dia   &&
                                                     defined $mes &&
                                                     defined $ano;
    ...
}

Detalhe: O DateTime tem funções de formatação de data tao boas quanto ;-)


>
> sub calcularDiaInicioHorarioVerao {
>     my $dia_inicio = `cal 10 2013 | tail -4 | head -1 | cut -d' ' -f7`;
> }
>
> sub calcularDiaFimHorarioVerao {
>     my $dia_fim = `cal 2 2014 | tail -4 | head -1 | cut -d' ' -f7`;
> }
>

Alguém já disse em substituir isso tudo por DateTime? :P


>
> sub  trim {
>     my $s = shift;
>     $s =~ s/^\s+|\s+$//g;
>     return $s;
> }
>
> print &criarData(2, 5, 2014);
> print &trim($dia_inicio);
> print &trim($dia_fim);
>

Não sei exatamente qual Perl você ta usando, mas acredito que não e'
necessário prefixar as chamadas de funções com &. Inclusive isso e'
considerado não legal hoje em dia :-)

[ ]'s

PS: Utilize uma ferramenta tipo pastebin ou Gist (do GitHub) para copiar e
enviar codigos em listas de e-mail :-)


>
> Geraldo Netto
> Sapere Aude => Non dvcor, dvco
> São Paulo, Brasil, -3gmt
> site: http://exdev.sf.net/
>
> 2014-02-26 23:41 GMT-03:00 Geraldo Netto <geraldonetto at gmail.com>:
> > Opa!
> >
> > Tudo okay Pessoal?
> >
> > Eu sou o Geraldo, um ghost reader da SPPM (e algumas outras PMs)
> > e eu ando trabalhando vagarosamente num projetinho
> > que eu dependo de verificação do horário de verão
> >
> > A idéia é separar o ano em 3 partes:
> >
> > fim do horário de verão (terceiro domingo de fevereiro)
> > fora do horário de verão
> > início do horário de verão (terceiro sábado de fevereiro)
> >
> > E baseado nisso, lançar um shell que vai receber o timezone, data de
> > início e de fim
> > p/ fazer a coleta de dados pelo hp openview (comando ovpmbatch)
> >
> > Só que...
> > -eu tenho um servidor tru64 (sem suporte)
> > -rodando perl 5.8 (2002 pelo o que o version diz...)
> > -sem sudo/root/possibilidade de instalação de pacotes de terceiros
> > -<inclua-aqui-todas-as-limitações-que-vocês-imaginarem-de-infra>
> > -meu "core business" é análise de desempenho de software,
> > então o código não pode ser muito "perlish"
> > porque alguém pode precisar dar manutenção depois de mim
> >
> > Embora eu ainda não tenha código real (só comecei a brincar)
> > Eu estou pensando em ir com a api do posix, especificamente a
> > função/método strftime
> >
> > Eventualmente vocês teriam alguma sugestão?
> >
> >
> > Grande Abraço!
> >
> > Geraldo Netto
> > Sapere Aude => Non dvcor, dvco
> > São Paulo, Brasil, -3gmt
> > site: http://exdev.sf.net/
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>



-- 
Bruno C. Buss
http://www.brunobuss.net


2014-02-28 11:59 GMT-03:00 Geraldo Netto <geraldonetto at gmail.com>:

> Bom Dia Pessoal!
>
> Consegui evoluir no código com a api do posix mesmo
> crio as datas com POSIX::strftime
> e calculo o horário de verão pegando a saida do comando cal no shell
>
> yep, eu sei que é feito, mas resolve o meu problema de um jeito rápido...
> por hora, a idéia é só gerar o "okay" da gerencia p/ matar umas 4
> versões shell que fazem o mesmo trabalho, mas precisam de alguns
> parâmetros diferentes e alguma intervenção humana especificamente no
> período de horário de verão
>
> a minha dúvida é primária, suponho...
> mas eu não entendi o porque usar o shift
> se eu posso verificar com o defined() se o @_[<número>] está definido?
>
> Aceito sugestões e Mais uma vez, Valeu mesmo pela força! :P
>
>
> BTW, código todo a seguir:
>
> #!/usr/bin/perl
>
> use strict;
> use warnings;
>
> use POSIX;
>
>
> # a inicia a data em 1900 entao, se for passado 95 => 1995
> sub calcularDeslocamentoAno {
>     die "ano invalido" unless defined(@_[0]) && return ($_[0] > 99 ?
> $_[0] - 1900 : $_[0]);
> }
>
> sub criarData {
>     die "parametros invalidos" unless (defined(@_[0]) &&
> defined(@_[1]) && defined(@_[2]));
>     #Usage: POSIX::strftime(fmt,             sec, min, hour, mday,
> mon, year, wday = -1, yday = -1, isdst = -1)
>     return POSIX::strftime("%Y,%m,%d", 0, 0, 0, @_[0], (@_[1] -1),
> &calcularDeslocamentoAno(@_[2]), 0, 0);
> }
>
> sub calcularDiaInicioHorarioVerao {
>     my $dia_inicio = `cal 10 2013 | tail -4 | head -1 | cut -d' ' -f7`;
> }
>
> sub calcularDiaFimHorarioVerao {
>     my $dia_fim = `cal 2 2014 | tail -4 | head -1 | cut -d' ' -f7`;
> }
>
> sub  trim {
>     my $s = shift;
>     $s =~ s/^\s+|\s+$//g;
>     return $s;
> }
>
> print &criarData(2, 5, 2014);
> print &trim($dia_inicio);
> print &trim($dia_fim);
>
> Geraldo Netto
> Sapere Aude => Non dvcor, dvco
> São Paulo, Brasil, -3gmt
> site: http://exdev.sf.net/
>
> 2014-02-26 23:41 GMT-03:00 Geraldo Netto <geraldonetto at gmail.com>:
> > Opa!
> >
> > Tudo okay Pessoal?
> >
> > Eu sou o Geraldo, um ghost reader da SPPM (e algumas outras PMs)
> > e eu ando trabalhando vagarosamente num projetinho
> > que eu dependo de verificação do horário de verão
> >
> > A idéia é separar o ano em 3 partes:
> >
> > fim do horário de verão (terceiro domingo de fevereiro)
> > fora do horário de verão
> > início do horário de verão (terceiro sábado de fevereiro)
> >
> > E baseado nisso, lançar um shell que vai receber o timezone, data de
> > início e de fim
> > p/ fazer a coleta de dados pelo hp openview (comando ovpmbatch)
> >
> > Só que...
> > -eu tenho um servidor tru64 (sem suporte)
> > -rodando perl 5.8 (2002 pelo o que o version diz...)
> > -sem sudo/root/possibilidade de instalação de pacotes de terceiros
> > -<inclua-aqui-todas-as-limitações-que-vocês-imaginarem-de-infra>
> > -meu "core business" é análise de desempenho de software,
> > então o código não pode ser muito "perlish"
> > porque alguém pode precisar dar manutenção depois de mim
> >
> > Embora eu ainda não tenha código real (só comecei a brincar)
> > Eu estou pensando em ir com a api do posix, especificamente a
> > função/método strftime
> >
> > Eventualmente vocês teriam alguma sugestão?
> >
> >
> > Grande Abraço!
> >
> > Geraldo Netto
> > Sapere Aude => Non dvcor, dvco
> > São Paulo, Brasil, -3gmt
> > site: http://exdev.sf.net/
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>



-- 
Bruno C. Buss
http://www.brunobuss.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20140228/51ae08e0/attachment-0001.html>


More information about the SaoPaulo-pm mailing list