<div dir="ltr">Oi Geraldo,<div><br></div><div>Respostas inline :-)</div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-02-28 11:59 GMT-03:00 Geraldo Netto <span dir="ltr"><<a href="mailto:geraldonetto@gmail.com" target="_blank">geraldonetto@gmail.com</a>></span>:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Bom Dia Pessoal!<br>
<br>
Consegui evoluir no código com a api do posix mesmo<br>
crio as datas com POSIX::strftime<br>
e calculo o horário de verão pegando a saida do comando cal no shell<br>
<br>
yep, eu sei que é feito, mas resolve o meu problema de um jeito rápido...<br>
por hora, a idéia é só gerar o "okay" da gerencia p/ matar umas 4<br>
versões shell que fazem o mesmo trabalho, mas precisam de alguns<br>
parâmetros diferentes e alguma intervenção humana especificamente no<br>
período de horário de verão<br></blockquote><div><br></div><div>Thumbs up por resolver o problema! :D</div><div><br></div><div>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).</div>

<div><br></div><div>Tente utilizar o DateTime, e' uma solução ordens de grandeza melhor e não e' tao difícil assim :-)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<br>
a minha dúvida é primária, suponho...<br>
mas eu não entendi o porque usar o shift<br>
se eu posso verificar com o defined() se o @_[<número>] está definido?<br></blockquote><div><br></div><div>O shift serve para voce retirar e retornar o 1o elemento da lista de argumentos/parâmetros que foi passada para sua função.</div>

<div><br></div><div>E' uma das formas idiomáticas de se fazer isso, a outra seria "my ($v_a, $v_b, $v_c) = @_;".</div><div>Pessoalmente prefiro com shift :-)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<br>
Aceito sugestões e Mais uma vez, Valeu mesmo pela força! :P<br>
<br>
<br>
BTW, código todo a seguir:<br>
<br>
#!/usr/bin/perl<br>
<br>
use strict;<br>
use warnings;<br>
<br>
use POSIX;<br>
<br>
<br>
# a inicia a data em 1900 entao, se for passado 95 => 1995<br>
sub calcularDeslocamentoAno {<br>
    die "ano invalido" unless defined(@_[0]) && return ($_[0] > 99 ?<br>
$_[0] - 1900 : $_[0]);<br>
}<br></blockquote><div><br></div><div>Então para você o ano 50 e' o mesmo que o ano 1950? :P</div><div>Ou se eu passar para você o ano 1800, ele retorna -100.</div><div><br></div><div>Outra coisa, você realmente não precisa colocar o return na mesma linha do die...<br>

</div><div>Por exemplo:<br></div><div><br></div><div>sub calcularDeslocamentoAno{</div><div>    my $ano = shift;</div><div><br></div><div>    #Rejeitando coisas que nossa funcao nao sabe tratar.</div><div>    die "ano invalido" unless defined $ano && $ano >= 1900;</div>

<div><br></div><div>    return $ano - 1900;</div><div>}</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<br>
sub criarData {<br>
    die "parametros invalidos" unless (defined(@_[0]) &&<br>
defined(@_[1]) && defined(@_[2]));<br>
    #Usage: POSIX::strftime(fmt,             sec, min, hour, mday,<br>
mon, year, wday = -1, yday = -1, isdst = -1)<br>
    return POSIX::strftime("%Y,%m,%d", 0, 0, 0, @_[0], (@_[1] -1),<br>
&calcularDeslocamentoAno(@_[2]), 0, 0);<br>
}<br></blockquote><div><br></div><div>Idealmente você estaria tratando:</div><div>* Se o 1o parâmetro e' um dia que esta' no mês (posso tentar usar stftime passando o dia 31 de Fev?)</div><div>* Se o 1o parâmetro e' um dia valido at all (dia igual a 44 por exemplo).</div>

<div>* Lembrar que o dia e o mês são 0-based, ou seja Janeiro => 0, Fev => 1, etc.</div><div>...</div><div><br></div><div>Voce tambem poderia fazer:</div><div>sub criarData {<br></div><div>    my ($dia, $mes, $ano) = @_;</div>

<div>    die "parametros invalidos" unless defined $dia   &&</div><div>                                                     defined $mes &&</div><div>                                                     defined $ano;</div>

<div>    ...</div><div>}</div><div><br></div><div>Detalhe: O DateTime tem funções de formatação de data tao boas quanto ;-)</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<br>
sub calcularDiaInicioHorarioVerao {<br>
    my $dia_inicio = `cal 10 2013 | tail -4 | head -1 | cut -d' ' -f7`;<br>
}<br>
<br>
sub calcularDiaFimHorarioVerao {<br>
    my $dia_fim = `cal 2 2014 | tail -4 | head -1 | cut -d' ' -f7`;<br>
}<br></blockquote><div><br></div><div>Alguém já disse em substituir isso tudo por DateTime? :P</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<br>
sub  trim {<br>
    my $s = shift;<br>
    $s =~ s/^\s+|\s+$//g;<br>
    return $s;<br>
}<br>
<br>
print &criarData(2, 5, 2014);<br>
print &trim($dia_inicio);<br>
print &trim($dia_fim);<br></blockquote><div><br></div><div>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 :-)</div>

<div><br></div><div>[ ]'s</div><div><br></div><div>PS: Utilize uma ferramenta tipo pastebin ou Gist (do GitHub) para copiar e enviar codigos em listas de e-mail :-)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


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

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