[Cascavel-pm] Duvida expressao regular?

loggos em loggos.com.br loggos em loggos.com.br
Quinta Outubro 18 11:48:42 PDT 2007


Saudações a todos.
Aproveitando as observações do Nilson, estou 
testando qr para pré-compilar regex e notei que 
faz muito pouca diferença, na prática.

Testaste este recurso Nilson ? O que tu achas ? 
Outro detalhe é que o resultado do benchmarck não 
bateu exatamente quando o programa foi rodado . 
Estive lendo e parece que existe mesmo uma 
diferença entre os indicadores do benchmarck e os 
indicadores obtidos qdo se roda a a rotina.

Abraço.

Roberto Bisotto


Message: 5
Date: Thu, 18 Oct 2007 14:05:46 -0200
From: "Nilson Santos Figueiredo Junior" 
<acid06 em gmail.com>
Subject: Re: [Cascavel-pm] Duvida expressao 
regular?
To: "Cascavel Perl Mongers" <cascavel-pm em pm.org>
Message-ID:
<9a08c9b40710180905x61ed12e4v1104a187fe8e5649 em mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1

On 10/18/07, Luis Motta Campos 
<luismottacampos em yahoo.co.uk> wrote:
> A segunda opcao eh "/o", que quer dizer "compile 
> Once" - informa o Perl
> de que a expressao regular em questao nao muda 
> ao longo do programa e
> pode ser compilada apenas uma vez. Isso ajuda a 
> performance do programa,
> quando voce usa expressoes regulares 
> "estaticas" - que nao variam
> dependendo de outras informacoes do seu 
> programa - em loops muito
> longos.

Na verdade, acho que atualmente não faz muito 
sentido usar a opção /o.
Além de não prover ganhos de performance, ela é, 
na verdade, um pouco
pior:

  use Benchmark qw/cmpthese/;

  cmpthese(5000, {
      normal => sub {
          for (1000..1999) { $i++ if /[13579]$/ }
      },
      with_o => sub {
          for (1000..1999) { $i++ if /[13579]$/o }
      }
  } );


Resultados:

           Rate normal with_o
  normal 1720/s     --    -2%
  with_o 1758/s     2%     --

-Nilson Santos F. Jr.



----- Original Message ----- 
From: <cascavel-pm-request em pm.org>
To: <cascavel-pm em pm.org>
Sent: Thursday, October 18, 2007 1:57 PM
Subject: Digest Cascavel-pm, volume 219, assunto 6


Enviar submissões para a lista de discussão 
Cascavel-pm para
cascavel-pm em pm.org

Para se cadastrar ou descadastrar via WWW, visite 
o endereço
http://mail.pm.org/mailman/listinfo/cascavel-pm
ou, via email, envie uma mensagem com a palavra 
'help' no assunto ou
corpo da mensagem para
cascavel-pm-request em pm.org

Você poderá entrar em contato com a pessoa que 
gerencia a lista pelo
endereço
cascavel-pm-owner em pm.org

Quando responder, por favor edite sua linha 
Assunto assim ela será
mais específica que "Re: Contents of Cascavel-pm 
digest..."


Tópicos de Hoje:

   1. Re: Duvida expressao regular? (Luis Motta 
Campos)
   2. Re: Duvida expressao regular? (Alceu 
Rodrigues de Freitas Junior)
   3. Re: contra barra - Resolvido (Luis Motta 
Campos)
   4. Re: contra barra (Ricardo Stock)
   5. Re: Duvida expressao regular? (Nilson Santos 
Figueiredo Junior)
   6. Re: Duvida expressao regular? (Alceu 
Rodrigues de Freitas Junior)


----------------------------------------------------------------------

Message: 1
Date: Thu, 18 Oct 2007 15:39:18 +0200
From: Luis Motta Campos 
<luismottacampos em yahoo.co.uk>
Subject: Re: [Cascavel-pm] Duvida expressao 
regular?
To: Cascavel Perl Mongers <cascavel-pm em pm.org>
Message-ID: <20071018133918.GC4096 em bitbistro.com>
Content-Type: text/plain; charset=us-ascii

On Thu, Oct 18, 2007 at 10:17:39AM -0300, Patty 
Silva wrote:
> Pessoal.. eu estava fazendo :
>  $urls =~ s/\r//g; para retirar o ^M do final.. 
> so que nao funcionou.. ai vi no forum para usar 
> o  $urls =~ s/\r//go;
> Procurei mais nao achei o que eh o go no final..
>
> algume pode explicar??
>

Sao duas opcoes diferentes, patty.
A primeira delas, "/g", quer dizer "apply 
Globbaly" - aplique quantas
vezes voce conseguir ao longo da string, retorne 
uma lista de
resultados (contexto de lista) ou "o proximo" 
resultado (contexto
escalar).

A segunda opcao eh "/o", que quer dizer "compile 
Once" - informa o Perl
de que a expressao regular em questao nao muda ao 
longo do programa e
pode ser compilada apenas uma vez. Isso ajuda a 
performance do programa,
quando voce usa expressoes regulares "estaticas" - 
que nao variam
dependendo de outras informacoes do seu programa - 
em loops muito
longos.


Tudo isso estah no manual, e voce jah perguntou 
estas coisas antes.

perldoc perlre

Putamplexos!
-- 
Luis Motta Campos
Perl Programmer, Hobbyist Cook and Photographer


------------------------------

Message: 2
Date: Thu, 18 Oct 2007 16:49:19 +0300
From: Alceu Rodrigues de Freitas Junior 
<glasswalk3r em hotmail.com>
Subject: Re: [Cascavel-pm] Duvida expressao 
regular?
To: Cascavel Perl Mongers <cascavel-pm em pm.org>
Message-ID: 
<BAY121-W19071C63CF33E45CB61D2FF59E0 em phx.gbl>
Content-Type: text/plain; charset="iso-8859-1"

Eu fiz um esforço para entender o que a opção /o 
ajudaria para eliminar quebras de linha do DOS... 
e não cheguei a conclusão nenhuma.

Essa opção serviria para otimizar a expressão 
regular, se ela usa algum tipo de interpolação. 
Usar /o significa dizer para o motor "não precisa 
mais recompilar a expressão regular". Isso já 
gerou bastante discussão no 
http://www.perlmonks.org 
(http://www.perlmonks.org/?node_id=269035), vale a 
pena dar uma lida.

A expressão regular para remover quebras de linha 
do DOS é /\r\n/... mas se você estiver usando 
ActivePerl numa máquina Windows, chomp já resolve 
o problema.

[]'s
Alceu

Date: Thu, 18 Oct 2007 10:25:08 -0300
From: cromo.jml em gmail.com
To: cascavel-pm em pm.org
Subject: Re: [Cascavel-pm] Duvida expressao 
regular?

Passei por esta dúvida estes dias desconhecia o 
terminador o:
What is '/o' really for?

http://perldoc.perl.org/perlfaq6.html#What-is-%27/o%27-really-for%3F

Márcio Vitor

On 10/18/07, Patty Silva <
ptfzs em yahoo.com.br> wrote:Pessoal.. eu estava 
fazendo :
 $urls =~ s/\r//g; para retirar o ^M do final.. so 
que nao funcionou.. ai vi no forum para usar o 
$urls =~ s/\r//go;

Procurei mais nao achei o que eh o go no final..

algume pode explicar??

Obrigada

[]ss




_________________________________________________________________
Explore the seven wonders of the world
http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: 
http://mail.pm.org/pipermail/cascavel-pm/attachments/20071018/9fde75b2/attachment-0001.html

------------------------------

Message: 3
Date: Thu, 18 Oct 2007 16:14:31 +0200
From: Luis Motta Campos 
<luismottacampos em yahoo.co.uk>
Subject: Re: [Cascavel-pm] contra barra - 
Resolvido
To: Cascavel Perl Mongers <cascavel-pm em pm.org>
Message-ID: <20071018141431.GD4096 em bitbistro.com>
Content-Type: text/plain; charset=iso-8859-1

On Thu, Oct 18, 2007 at 11:26:15AM -0300, Ricardo 
Stock wrote:
> Obrigado a ajuda que tive, ao igor e ao "Chomp"
>
> ficou assim o código
>
> $caminho=sprintf('local\usuario\%s', $numero);
> my $sth = $dbh->prepare( q{UPDATE usuarios
>     SET caminho = ? WHERE numero = ?} );
> $sth->execute($caminho, $numero);
>
> Explicando melhor funciona assim
>
> 1 - Recebe os dados via form html (os erros de 
> preenchimento são tratados
> via JS)

Eu nao devia, mas vou apontar FALHA GRAVE DE 
SEGURANCA no teu sistema,
por voce confiar no JS para verificacao de erros 
de preenchimento. Tome
cuidado, e trate de validar seus dados SERVER 
SIDE - JS pode ser
reescrito, invalidado, ignorado e torcido de uma 
infinidade de maneiras
diferentes.

E, jah que voce esta escrevendo CGI, pelo menos 
diga que voce estah
usando o CGI::Application, ou , melhor ainda, o 
Catalyst... ;)

> 2 - Chama função para cadastrar.
> 3 - uma vez cadastrado, como o campo numero é 
> auto incrementado, faça uma
> busca pelo numero e obtenho o mesmo para fazer o 
> caminho

Bom, jah que voce estah usando MySQL (espero que 
seja pelo menos o 5.1 -
mas voce deveria mesmo era usar Postgres, que eh 
uma base de dados
seria), use $dbi->last_insert_id() para obter o 
numero do insert que
voce terminou de fazer. Assim, voce economiza um 
SELECT.

> 4 - crio a pasta no local indicado pelo numero 
> do usuário
> 5 - Atualizo o banco com o numero no caminho exe 
> local/ususario/1234

Eu ateh tenho medo de perguntar, mas o senso do 
dever fala mais alto:
Voce pode por favor me explicar para que precisa 
ter uma interface web
que cadastra usuarios e associa um diretorio 
server-side para cada um
deles? Isso estah me cheirando a idiosincrasia 
empresaral aguda, e eu
acho que existe pelo menos uns 5 jeitos mais 
limpos, elegantes e
economicos de resolver o teu problema... quer 
falar mais sobre isso
antes de continuar?

> 6 - dou o retorno em html do registro.

"Retorno em html" ? Bom, outra vez, eu vou apontar 
voce para o jeito
certo de fazer, meu caro... use o HTML::Template, 
ou o TT (Template
Toolkit) para gerar seu HTML a partir de 
templates. Desta forma, voce
mantem seu codigo longe do tipo de caca que 
estraga programas com
interface web: o HTML.

Putamplexos!
-- 
Luis Motta Campos
Perl Programmer, Hobbyist Cook and Photographer


------------------------------

Message: 4
Date: Thu, 18 Oct 2007 12:00:33 -0300
From: "Ricardo Stock" <ricardostock em bol.com.br>
Subject: Re: [Cascavel-pm] contra barra
To: "Cascavel Perl Mongers" <cascavel-pm em pm.org>
Message-ID: 
<00cf01c81197$a9983e80$0200a8c0 em Ricardo>
Content-Type: text/plain; charset="iso-8859-1"

valeu Alceu... eu havia pensado na concatenação 
das variaveis, e achoq ue fica melhor assim 
mesmo.... obrigado... vou dar mais uma mexida no 
codigo.


  ----- Original Message ----- 
  From: Alceu Rodrigues de Freitas Junior
  To: Cascavel Perl Mongers
  Sent: Thursday, October 18, 2007 9:17 AM
  Subject: Re: [Cascavel-pm] contra barra


  > Date: Thu, 18 Oct 2007 12:47:38 +0100
  > From: igor.sutton em yahoo.co.uk
  > Depois de fazer o que o Champs falou em outro 
email,
  > você pode montar facilmente o caminho assim:
  >
  > $caminho = sprintf('\meu\caminho\%s', 
$numero);
  >
  > perldoc -f sprintf
  > perldoc -f q

  Ou então usar File::Spec para contatenar $numero 
com o diretório usando a função catfile. Com isso 
seu programa ainda fica mais portável.

  perldoc File::Spec.

  []'s
  Alceu


------------------------------------------------------------------------------
  Discover the new Windows Vista Learn more!


------------------------------------------------------------------------------


  _______________________________________________
  Cascavel-pm mailing list
  Cascavel-pm em pm.org
  http://mail.pm.org/mailman/listinfo/cascavel-pm
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: 
http://mail.pm.org/pipermail/cascavel-pm/attachments/20071018/1dfd638b/attachment-0001.html

------------------------------

Message: 5
Date: Thu, 18 Oct 2007 14:05:46 -0200
From: "Nilson Santos Figueiredo Junior" 
<acid06 em gmail.com>
Subject: Re: [Cascavel-pm] Duvida expressao 
regular?
To: "Cascavel Perl Mongers" <cascavel-pm em pm.org>
Message-ID:
<9a08c9b40710180905x61ed12e4v1104a187fe8e5649 em mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1

On 10/18/07, Luis Motta Campos 
<luismottacampos em yahoo.co.uk> wrote:
> A segunda opcao eh "/o", que quer dizer "compile 
> Once" - informa o Perl
> de que a expressao regular em questao nao muda 
> ao longo do programa e
> pode ser compilada apenas uma vez. Isso ajuda a 
> performance do programa,
> quando voce usa expressoes regulares 
> "estaticas" - que nao variam
> dependendo de outras informacoes do seu 
> programa - em loops muito
> longos.

Na verdade, acho que atualmente não faz muito 
sentido usar a opção /o.
Além de não prover ganhos de performance, ela é, 
na verdade, um pouco
pior:

  use Benchmark qw/cmpthese/;

  cmpthese(5000, {
      normal => sub {
          for (1000..1999) { $i++ if /[13579]$/ }
      },
      with_o => sub {
          for (1000..1999) { $i++ if /[13579]$/o }
      }
  } );


Resultados:

           Rate normal with_o
  normal 1720/s     --    -2%
  with_o 1758/s     2%     --

-Nilson Santos F. Jr.


------------------------------

Message: 6
Date: Thu, 18 Oct 2007 19:57:23 +0300
From: Alceu Rodrigues de Freitas Junior 
<glasswalk3r em hotmail.com>
Subject: Re: [Cascavel-pm] Duvida expressao 
regular?
To: Cascavel Perl Mongers <cascavel-pm em pm.org>
Message-ID: 
<BAY121-W2087E05457C48ADE520E63F59E0 em phx.gbl>
Content-Type: text/plain; charset="iso-8859-1"

> Date: Thu, 18 Oct 2007 14:05:46 -0200
> From: acid06 em gmail.com
> On 10/18/07, Luis Motta Campos 
> <luismottacampos em yahoo.co.uk> wrote:
> > A segunda opcao eh "/o", que quer dizer 
> > "compile Once" - informa o Perl
> > de que a expressao regular em questao nao muda 
> > ao longo do programa e
> > pode ser compilada apenas uma vez. Isso ajuda 
> > a performance do programa,
> > quando voce usa expressoes regulares 
> > "estaticas" - que nao variam
> > dependendo de outras informacoes do seu 
> > programa - em loops muito
> > longos.
>
> Na verdade, acho que atualmente não faz muito 
> sentido usar a opção /o.
> Além de não prover ganhos de performance, ela é, 
> na verdade, um pouco
> pior:
>
>   use Benchmark qw/cmpthese/;
>
>   cmpthese(5000, {
>       normal => sub {
>           for (1000..1999) { $i++ if 
> /[13579]$/ }
>       },
>       with_o => sub {
>           for (1000..1999) { $i++ if 
> /[13579]$/o }
>       }
>   } );
>
> Resultados:
>
>            Rate normal with_o
>   normal 1720/s     --    -2%
>   with_o 1758/s     2%     --

Na minha máquina deu diferente:

         Rate with_o normal
with_o 2064/s     --    -1%
normal 2077/s     1%     --

Eu executei várias vezes o teste, mas o with_o 
saiu na frente a maioria das vezes. O engraçado é 
que ele deveria ser melhor se houvesse algo para 
interpolar na regex.

Eu achei isso estranho e resolvi fazer mais dois 
testes:

<test2>
use Benchmark qw/cmpthese/;

my $string = 'foobar';
my $compiled = qr/[13579]($string)?/;
my $i;

cmpthese(
    5000,
    {
        normal_with_text => sub {
            for ( 1000 .. 1999 ) { $i++ if 
/[13579]($string)?/ }
        },
        with_o_and_text => sub {
            for ( 1000 .. 1999 ) { $i++ if 
/[13579]($string)?/o }
        },
        compile_with_qr => sub {
            for ( 1000 .. 1999 ) { $i++ if 
/$compiled/ }
          }
    }
);
</test2>

O resultado foi mais estranho ainda:

                  Rate normal_with_text 
with_o_and_text  compile_with_qr
normal_with_text 
       --              -5%             -18%
with_o_and_text  748/s 
5%               --             -14%
compile_with_qr  865/s              21% 
16%               --

Mais um teste:

<test3>
use Benchmark qw(cmpthese);

my $string = 'foobar';
my $compiled = qr/$string/;
my $i;

cmpthese(
    200000,
    {
        normal_with_text => sub {
            for ( a .. z ) { $i++ if /$string/ }
        },
        with_o_and_text => sub {
            for ( a .. z ) { $i++ if /$string/o }
        },
        compile_with_qr => sub {
            for ( a .. z ) { $i++ if /$compiled/ }
          }
    }
);
</test3>

E o resultado foi algo mais razoável (mas a 
expressão regular foi alterada):

                     Rate  compile_with_qr 
normal_with_text  with_o_and_text
compile_with_qr 
           --              -1%             -12%
normal_with_text  90785/s 
1%               --             -11%
with_o_and_text  101523/s              13% 
12%               --

A única coisa que consigo tirar desse teste é que 
é difícil afirmar qual técnica funcionará melhor. 
Aparentemente dependerá também expressão regular 
sendo verificada, então só testes com Benchmark 
para afirmar o que funciona mais rápido.

Só para constar:

This is perl, v5.8.8 built for 
MSWin32-x86-multi-thread
(with 50 registered patches, see perl -V for more 
detail)

Copyright 1987-2006, Larry Wall

Binary build 820 [274739] provided by ActiveState 
http://www.ActiveState.com
Built Jan 23 2007 15:57:46

Rodando em um processador Centrino Duo 1.66GHz, 
com 504MB de RAM (maldita placa de vídeo!).

Se alguém mais topar rodar os testes e mandar pra 
lista, pode ser interessante.

[]'s
Alceu

_________________________________________________________________
Explore the seven wonders of the world
http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: 
http://mail.pm.org/pipermail/cascavel-pm/attachments/20071018/e93859ea/attachment.html

------------------------------

_______________________________________________
Cascavel-pm mailing list
Cascavel-pm em pm.org
http://mail.pm.org/mailman/listinfo/cascavel-pm

Fim da Digest Cascavel-pm, volume 219, assunto 6
************************************************



-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.488 / Virus Database: 269.15.0/1077 - 
Release Date: 18/10/2007 09:54




Mais detalhes sobre a lista de discussão Cascavel-pm