Programação em Perl

Eddy

Membro participativo
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 :)
 
Última edição:
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.
 
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)
 
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 :)
 
"perl is not an acronym"

o que entendes por sub-função?

o que queres fazer?

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 :)
 
"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 apr:)

Cumps,
Edd :)
 
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;
 
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.
 
Realmente, há qq coisa nesta linguagem que me escapa... :( [8b]

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! [8b] [8b] [s)]

Cumps,
Edd :)
 
Realmente, há qq coisa nesta linguagem que me escapa... :( [8b]

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! [8b] [8b] [s)]

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"?
 
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». [8b] [:D]

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


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


Cumps, THX!
Edd :)
 
És grande Tuborg!

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

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


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


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...
 
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

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!!! [kiss] apr:)


Cumps,
Edd :)
 
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... [:)] [:D]

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 :)
 
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
 
Última edição:
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);
 
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 :)
 
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 = [
{}
];
 
Última edição:
Voltar
Superior