Anúncio

Collapse
No announcement yet.

Programação em Perl

Collapse

Ads nos topicos Mobile

Collapse

Ads Nos topicos Desktop

Collapse
X
Collapse
Primeira Anterior Próxima Última
 
  • Filtrar
  • Tempo
  • Show
Clear All
new posts

    Programação em Perl

    Boas caros colegas,


    Estou aqui a fazer umas coisas em PERL e tenho aqui umas dúvidas e visto q o programa q estou a utilizar não possuí ajuda, venho aqui tirar umas dúvidas/pedir uma ajuda:

    A função chomp() retira os espaços e "Enters" no fim de uma string, certo?
    Agora se eu quiser limpar os espaços e tabulações de dois lados de uma string, como é q se faz? Isto é, se for possível...!


    Thx,
    Edd
    Editado pela última vez por Eddy; 23 March 2009, 20:15. Razão: Edição do título ("Perl is not an acronym")

    #2
    Já não mexo em perl há seculos, portanto deve haver uma maneira melhor de fazer, mas assim de repente podes sempre fazer reverse à string, aplicar o chomp, fazer reverse outra vez e aplicar novamente.

    PS: Se calhar com uma expressão regular safavas-te melhor.

    Comentário


      #3
      O que tu queres em algumas linguagens chama-se ltrim e rtrim.

      Isso não existe em perl, mas é fácil de implementar:

      Perl trim function to strip whitespace from a string

      Comentário


        #4
        Obrigado malta,

        Vou analisar...!


        Edd

        Comentário


          #5
          O que tu querias dizer era Perl e não PERL (não me leves a mal)

          faz assim:
          $str =~ s/^\s+//; #remove first white spaces (/n /r/n included)
          $str =~ s/\s+$//;
          #remove last white spaces (/n /r/n included)

          Comentário


            #6
            Originalmente Colocado por dr_tuborg Ver Post
            O que tu querias dizer era Perl e não PERL (não me leves a mal)

            faz assim:
            $str =~ s/^\s+//; #remove first white spaces (/n /r/n included)
            $str =~ s/\s+$//; #remove last white spaces (/n /r/n included)
            Sinceramente n entendo mt desta linguagem, estou agora a começar... Podes explicar o pq?
            Qual a diferença?


            Como posso fazer com que isto:
            Código:
            # Perl trim function to remove whitespace from the start and end of the string
            sub trim($)
            {
            my $string = shift;
            $string =~ s/^\s+//;
            $string =~ s/\s+$//;
            return $string;
            }
            Obrigado Mooch...!
            Se torne uma «sub-função» dentro do meu programa principal?
            É possível?



            Cumps e thx,
            Edd

            Comentário


              #7
              "perl is not an acronym"

              o que entendes por sub-função?

              o que queres fazer?

              Originalmente Colocado por Eddy Ver Post
              Sinceramente n entendo mt desta linguagem, estou agora a começar... Podes explicar o pq?
              Qual a diferença?


              Como posso fazer com que isto:
              Código:
              # Perl trim function to remove whitespace from the start and end of the string
              sub trim($)
              {
              my $string = shift;
              $string =~ s/^\s+//;
              $string =~ s/\s+$//;
              return $string;
              }
              Obrigado Mooch...!
              Se torne uma «sub-função» dentro do meu programa principal?
              É possível?



              Cumps e thx,
              Edd

              Comentário


                #8
                Originalmente Colocado por dr_tuborg Ver Post
                "perl is not an acronym"

                o que entendes por sub-função?

                o que queres fazer?

                Ok, percebi... Perl n é acrónimo!
                (vou editar o título)

                Sub-função entendo por uma parte de um programa q está no msm "local" (entenda-se ficheiro) q o programa principal, mas q pode ser chamado diversas vezes.

                Eu preciso de remover várias vezes espaços, \n e/ou \t de uma string assim, estava constante/ a chamar essa função e n a colocar o msm código repetido.


                Espero ter-me feito perceber... e obrigado

                Cumps,
                Edd

                Comentário


                  #9
                  A solução para isso é mesmo a que já postaram.
                  Pões isto algures no teu código. Eu costumo por as subs no fim do ficheiro caso sejam locais, ou então num módulo à parte caso precise delas para outros scripts:

                  sub trim
                  {
                  my $string = shift;
                  $string =~ s/^\s+//;
                  $string =~ s/\s+$//;
                  return $string;
                  }
                  Depois usas desta forma:

                  my $str = trim(" foo bar ");
                  print $str;

                  Exemplo completo:
                  Código:
                  #!/usr/bin/perl
                  
                  use strict;
                  use warnings;
                  
                  my $str = " foo bar     ";
                  my $str2 = trim($str);
                  print $str2 . "\n";
                  
                  
                  sub trim
                  {
                  my $string = shift; #get first param. This can also be done like this: my ($string) = @_; I prefer the first.
                  $string =~ s/^\s+//; #remove first 
                  $string =~ s/\s+$//; #remove last
                  return $string;
                  }
                  1;

                  Comentário


                    #10
                    Originalmente Colocado por dr_tuborg Ver Post
                    A solução para isso é mesmo a que já postaram.
                    Pões isto algures no teu código. Eu costumo por as subs no fim do ficheiro caso sejam locais, ou então num módulo à parte caso precise delas para outros scripts:

                    sub trim
                    {
                    my $string = shift;
                    $string =~ s/^\s+//;
                    $string =~ s/\s+$//;
                    return $string;
                    }
                    Depois usas desta forma:

                    my $str = trim(" foo bar ");
                    print $str;

                    Exemplo completo:
                    Código:
                    #!/usr/bin/perl
                     
                    use strict;
                    use warnings;
                     
                    my $str = " foo bar     ";
                    my $str2 = trim($str);
                    print $str2 . "\n";
                     
                     
                    sub trim
                    {
                    my $string = shift; #get first param. This can also be done like this: my ($string) = @_; I prefer the first.
                    $string =~ s/^\s+//; #remove first 
                    $string =~ s/\s+$//; #remove last
                    return $string;
                    }
                    1;
                    Obrigado!!!

                    Só uma pergunta, estou habituado a C++ onde era necessário "declarar" as funções caso se escrevessem no fim da funcção main, em Perl tb é necessário?



                    Cumps,
                    Edd

                    PS: Estou aqui a ter um outro problema q n estou a perceber o por quê, dps digo.

                    Comentário


                      #11
                      Realmente, há qq coisa nesta linguagem que me escapa...

                      Alguém detecta um erro neste bloco?

                      Código:
                      $i=0;
                        foreach $IP_intfc (@ip_address) {
                         chomp($IP_intfc);
                         if ($IP_intfc !~ "#NA") {
                          print "IP da Int.: #$IP_intfc#\n";
                          my @comando = $session->cmd("show ip route $IP_intfc"); ***
                          @rede_IP[$i] = "#NA";
                          foreach $intfc (@comando) {
                           if ($intfc =~ /Routing entry for (.*)\/ /) {
                            @rede_IP[$i] = $1;
                           }
                          }
                         }
                         $i++;
                        }
                      Está a dar-me erro!

                      IP da Int.: #10.217.0.5#
                      Can't call method "cmd" on an undefined value at script_csv.pl line 134.
                      Estou a passar-me!

                      Cumps,
                      Edd

                      Comentário


                        #12
                        Originalmente Colocado por Eddy Ver Post
                        Realmente, há qq coisa nesta linguagem que me escapa...

                        Alguém detecta um erro neste bloco?

                        Código:
                        $i=0;
                          foreach $IP_intfc (@ip_address) {
                           chomp($IP_intfc);
                           if ($IP_intfc !~ "#NA") {
                            print "IP da Int.: #$IP_intfc#\n";
                            my @comando = $session->cmd("show ip route $IP_intfc"); ***
                            @rede_IP[$i] = "#NA";
                            foreach $intfc (@comando) {
                             if ($intfc =~ /Routing entry for (.*)\/ /) {
                              @rede_IP[$i] = $1;
                             }
                            }
                           }
                           $i++;
                          }
                        Está a dar-me erro!



                        Estou a passar-me!

                        Cumps,
                        Edd

                        o teu $session está undefined.

                        E isto @rede_IP[$i] também não se usa.
                        $rede_IP[$i] é a forma correcta.
                        Não te dá erro se fizeres um "perl -c nome_do_script.pl"?

                        Comentário


                          #13
                          Originalmente Colocado por dr_tuborg Ver Post
                          o teu $session está undefined.

                          E isto @rede_IP[$i] também não se usa.
                          $rede_IP[$i] é a forma correcta.
                          Não te dá erro se fizeres um "perl -c nome_do_script.pl"?
                          És grande Tuborg!

                          O problema do session é q a sessão 'estava definida' em PT, ou seja o nome correcto da variável é «sessao».

                          É o q dá, por vezes passamos tanto tempo a olhar p/ uma coisa q dps n percebemos erros básicos!


                          O q me explicaram é q se fazia assim, pq se trata de um vector.


                          Cumps, THX!
                          Edd

                          Comentário


                            #14
                            Originalmente Colocado por Eddy Ver Post
                            És grande Tuborg!

                            O problema do session é q a sessão 'estava definida' em PT, ou seja o nome correcto da variável é «sessao».

                            É o q dá, por vezes passamos tanto tempo a olhar p/ uma coisa q dps n percebemos erros básicos!


                            O q me explicaram é q se fazia assim, pq se trata de um vector.


                            Cumps, THX!
                            Edd

                            O que isso te dá é um array de uma posição. Mas tudo bem.
                            There's more than one way to do it...

                            Comentário


                              #15
                              Originalmente Colocado por Mooch Ver Post
                              O que tu queres em algumas linguagens chama-se ltrim e rtrim.

                              Isso não existe em perl, mas é fácil de implementar:

                              Perl trim function to strip whitespace from a string
                              Originalmente Colocado por dr_tuborg Ver Post
                              O que tu querias dizer era Perl e não PERL (não me leves a mal)

                              faz assim:
                              $str =~ s/^\s+//; #remove first white spaces (/n /r/n included)
                              $str =~ s/\s+$//;
                              #remove last white spaces (/n /r/n included)
                              Obrigado colegas...

                              Funcionou às mil maravilhas e é realmente fácil!!!


                              Cumps,
                              Edd

                              Comentário


                                #16
                                Originalmente Colocado por dr_tuborg Ver Post
                                O que isso te dá é um array de uma posição. Mas tudo bem.
                                There's more than one way to do it...

                                Tuborg, estou a ver q percebes mais disto q de cevada...

                                N percebi se queres dizer um vector de uma dimensão (normal) ou um vector de apenas uma posição msm, tipo de uma variável (comum)!

                                N sei se é por o Perl ser "inteligente" mas ele cria-me um vector uni-dimensional.

                                Então qd é q se deve usar o '@' e o '$'?

                                O comando q me deste n me dá erro.


                                Cumps,
                                Edd

                                Comentário


                                  #17
                                  Como data types em Perl tens:
                                  scalar
                                  array
                                  hash
                                  -----
                                  Depois tens também:
                                  array ref
                                  hash ref
                                  isto são referencias para array e hash respectivamente.


                                  Exemplo prático:
                                  my @arr = (1..10);
                                  print $arr[3]; #prints out: 4
                                  --------
                                  my $arr = [1..10];
                                  print $arr[3]; #ERROR @arr is not defined
                                  print $arr->[3]; #prints: 4
                                  ---------

                                  Podes ver mais aqui: perldata - Perl data types - search.cpan.org
                                  E aqui, uma iniciação a arrays: Perl Tutorial - Arrays
                                  E para hashes: Perl Hash Howto
                                  Editado pela última vez por drtuborg; 25 March 2009, 11:42.

                                  Comentário


                                    #18
                                    Epá....eu ainda estou a pensar no teu:
                                    @rede_IP[$i] = "#NA";

                                    É que isto não me entra na cabeça de maneira nenhuma.

                                    Podes fazer um print Dumper(\@rede_IP) depois do ciclo e mostrar-me o resultado?
                                    Vais precisar de incluir o modulo: Data::Dumper;
                                    Ou seja:
                                    use Data::Dumper;
                                    print Dumper(\@rede_IP);

                                    Comentário


                                      #19
                                      Originalmente Colocado por dr_tuborg Ver Post
                                      Epá....eu ainda estou a pensar no teu:
                                      @rede_IP[$i] = "#NA";

                                      É que isto não me entra na cabeça de maneira nenhuma.

                                      Podes fazer um print Dumper(\@rede_IP) depois do ciclo e mostrar-me o resultado?
                                      Vais precisar de incluir o modulo: Data::Dumper;
                                      Ou seja:
                                      use Data::Dumper;
                                      print Dumper(\@rede_IP);

                                      Thx,

                                      Hoje n tive tempo p/ vir ao fórum, amanhã devo ter algum a ver se te faço isso.


                                      Edd

                                      Comentário


                                        #20
                                        Consigo enviar esse dump para um ficheiro?

                                        Se calhar é mais prático...

                                        Coloco o
                                        Código:
                                        print Dumper(\@rede_IP);
                                        no fim do programa, certo?



                                        Outra questão, como é que faço para que ele me feche a janela de DOS se o programa correr sem problemas?

                                        É pah... n consigo deixar de te agradecer! Thx
                                        Edd

                                        Edit:
                                        Entretanto fiz o q me pediste e o brilhante resultado é:

                                        $VAR1 = [
                                        {}
                                        ];
                                        Editado pela última vez por Eddy; 26 March 2009, 14:18. Razão: Edit

                                        Comentário


                                          #21
                                          DOS?????

                                          estás a executar Perl em Windoes?


                                          Não te vou dizer que não funciona, mas é muito limitado. Muitos módulos que estao no CPAN não funcionam nesse "SO".

                                          Dá para fazeres coisas básicas, mas se precisares de descomplicar código não é o melhor ambiente de trabalho.

                                          Comentário


                                            #22
                                            Originalmente Colocado por dr_tuborg Ver Post
                                            DOS?????

                                            estás a executar Perl em Windoes?


                                            Não te vou dizer que não funciona, mas é muito limitado. Muitos módulos que estao no CPAN não funcionam nesse "SO".

                                            Dá para fazeres coisas básicas, mas se precisares de descomplicar código não é o melhor ambiente de trabalho.
                                            Ahhh... pois, estou sim, estou a trabalhar em windows, devia estar em unix ou linux, n era?

                                            Aqui no serviço n há, tem q ser msm assim.
                                            O dump da variável ajudou alguma coisa?


                                            Cumps e thx,
                                            Edd

                                            Comentário


                                              #23
                                              Tanta gaja boa...

                                              Comentário


                                                #24
                                                Boas,

                                                Volto com mais umas dúvidas:

                                                Neste comando

                                                Código:
                                                 my $sessao = Net::Telnet::Cisco->new(host => $end_ip, errmode => 'return');
                                                O q posso fazer para o programa n parar?

                                                O q se passa é q por vezes o programa pára sem motivo aparente e estava aqui a pensar se poderei colocar um temporizador de modo a q siga sem problemas.
                                                A única premissa é o programa n sair mas sim continuar a sua execução, isto se for possível claro.


                                                Cumps,
                                                Edd

                                                Comentário


                                                  #25
                                                  Originalmente Colocado por Eddy Ver Post
                                                  Boas,

                                                  Volto com mais umas dúvidas:

                                                  Neste comando

                                                  Código:
                                                   my $sessao = Net::Telnet::Cisco->new(host => $end_ip, errmode => 'return');
                                                  O q posso fazer para o programa n parar?

                                                  O q se passa é q por vezes o programa pára sem motivo aparente e estava aqui a pensar se poderei colocar um temporizador de modo a q siga sem problemas.
                                                  A única premissa é o programa n sair mas sim continuar a sua execução, isto se for possível claro.


                                                  Cumps,
                                                  Edd
                                                  O que é que consideras parar?

                                                  A conexão não pode estar aberta sem estar a ser usada... é o servidor
                                                  (serviço) que a termina.

                                                  Comentário


                                                    #26
                                                    Originalmente Colocado por Nuno156 Ver Post
                                                    O que é que consideras parar?

                                                    A conexão não pode estar aberta sem estar a ser usada... é o servidor
                                                    (serviço) que a termina.
                                                    Enquanto nuns equipamentos demora pouquissimo, noutros está ali uma eternidade, já cheguei a deixar estar 10min e nada, n passa dali e n recolhe a informação q eu quero.

                                                    É isto q eu considero parar, se calhar n é a melhor maneira de colocar a coisa.

                                                    Espero ter-me feito entender...

                                                    Edd

                                                    Comentário


                                                      #27
                                                      Agora o comando não me funciona numa outra máquina UNIX... só corre na máquina Win.

                                                      Código:
                                                       my $sessao = Net::Telnet::Cisco->new(host => $end_ip, errmode => 'return');
                                                      Como é q eu posso por isto a correr em UNIX?

                                                      Há alguma conversão *.pl -> "executável" UNIX?

                                                      N posso instalar as livrarias...


                                                      Edd

                                                      Comentário


                                                        #28
                                                        Originalmente Colocado por Eddy Ver Post
                                                        Agora o comando não me funciona numa outra máquina UNIX... só corre na máquina Win.

                                                        Código:
                                                         my $sessao = Net::Telnet::Cisco->new(host => $end_ip, errmode => 'return');
                                                        Como é q eu posso por isto a correr em UNIX?

                                                        Há alguma conversão *.pl -> "executável" UNIX?

                                                        N posso instalar as livrarias...


                                                        Edd
                                                        Faz "dos2unix ficheiro.pl" para converter o par CR/LF.

                                                        Comentário


                                                          #29
                                                          Originalmente Colocado por Eddy Ver Post
                                                          Enquanto nuns equipamentos demora pouquissimo, noutros está ali uma eternidade, já cheguei a deixar estar 10min e nada, n passa dali e n recolhe a informação q eu quero.

                                                          É isto q eu considero parar, se calhar n é a melhor maneira de colocar a coisa.

                                                          Espero ter-me feito entender...

                                                          Edd
                                                          Podes experimentar alterar a filosofia do programa, para usar THREADS.

                                                          Se a biblioteca NET::TELNET::CISCO tiver um parâmetro de TIMEOUT melhor
                                                          ainda. Assim todas as ligações são feitas concorrentemente, e não ficam à
                                                          espera uma da outra. O programa prossegue assim que todas terminarem ou
                                                          derem TIMEOUT.

                                                          Por exemplo, se fizeres 50 ligações, cada uma com um TIMEOUT de 30
                                                          segundos, com THREADS ficas à espera, no máximo, cerca de 30 segundos.
                                                          Sem THREADS, ficas à espera, no máximo, cerca de 30 x 50 segundos.

                                                          Comentário


                                                            #30
                                                            Originalmente Colocado por Nuno156 Ver Post
                                                            Faz "dos2unix ficheiro.pl" para converter o par CR/LF.
                                                            Já fiz: dos2unix -iso -ascii -7 Script_csvV2.pl Script_V2

                                                            Deveria colocar alguma coisa como extensão, n?
                                                            É q n percebo nada de UNIX! Estou p/ aqui a inventar... e isto n corre...
                                                            Como é q dps se corre isto?

                                                            Originalmente Colocado por Nuno156 Ver Post
                                                            Podes experimentar alterar a filosofia do programa, para usar THREADS.

                                                            Se a biblioteca NET::TELNET::CISCO tiver um parâmetro de TIMEOUT melhor
                                                            ainda. Assim todas as ligações são feitas concorrentemente, e não ficam à
                                                            espera uma da outra. O programa prossegue assim que todas terminarem ou
                                                            derem TIMEOUT.

                                                            Por exemplo, se fizeres 50 ligações, cada uma com um TIMEOUT de 30
                                                            segundos, com THREADS ficas à espera, no máximo, cerca de 30 segundos.
                                                            Sem THREADS, ficas à espera, no máximo, cerca de 30 x 50 segundos.
                                                            Até modificava o raciocínio, se soubesse!
                                                            Eu sei q estou a pedir mt mas, como é q vejo se aquela biblioteca tem um paràmetro de time-out?

                                                            N tens 30min p/ explicar isto tudo, n?

                                                            Em todo o caso mt obrigado por tudo o q já ajudaste até aqui!


                                                            Cumps,
                                                            Edd

                                                            Comentário

                                                            AD fim dos posts Desktop

                                                            Collapse

                                                            Ad Fim dos Posts Mobile

                                                            Collapse
                                                            Working...
                                                            X