[Rio-pm] problema em match de arquivos

Marco A P D'Andrade mdacwb em gmail.com
Segunda Junho 12 21:19:24 PDT 2006


Breno,

Em perlre achei a seguinte referencia:
  In addition, Perl defines the following:
   ...
    \pP Match P, named property.  Use \p{Prop} for longer names.
   ...

Como vc esta fazendo expressao regular com variaveis, vc deve usar os
escapes ...
   $regex =~ s/\\/\\\\/g  if ( $^O =~ /win32/i );

Mas creio que uma mudança de abordagem seria produtiva ...

Em vez de comparar com RE, que tal eq ??
   if ( $_ eq $ignorado ) { print "*** ignorei $_ ***"; }


Por outro lado... vc pode precisar de mascaras para ignorar, certo?

Que tal fazer um processo específico para carregar a lista de
ignorados em um hash e verificar se existe depois ??

Quais as sintaxes validas para ignorado?

São validos:
  \path\*
  \path\*\*.log  << Complica mais!

Se a mascara for somente no arquivo é muito mais simples!!

  map { $Ignorados{$_}=0 } glob($ignorado)

Para simplificar a discussão ...

#---------------
 my %Ignorados;
  open(ARQ, '<', 'ignorado.txt') or die "$!\n";
  while ( defined( $_ = <ARQ> ) ) {
	chomp;
	map { $Ignorados{$_}=0 } glob($_);
  }
  close(ARQ);
  open(ARQ, '<', 'diretorio.txt') or die "$!\n";
  chomp(my $dir = <ARQ>);  # aqui eu leio '\*'
  close(ARQ);

  foreach ( glob($dir) ) {
	print "Pesquisando \"$_\":\n";
	if ( exists($Ignorados{$_}) ) {
		print ">> Ignorar $_\n";
		next;
	}
	print ".";
  }
#--------------->> novo ignorados.txt (nao tinha pagefile.sys no drive
em teste ;D
\ace.log
\pagefile.sys
\hp*.*
#---------------


Sds,
Marco Antonio

Em 13/06/06, breno em clavis.com.br<breno em clavis.com.br> escreveu:
> Salve pessoal,
>
> estou com o seguinte problema: tenho uma lista de arquivos a serem lidos (expandidos via
> glob() e outra lista de arquivos a serem ignorados. Mas devo estar comendo mosca em
> algum lugar pois não sei pq não está funcionando.
>
> O código abaixo reproduz o problema (obs: o código é PARA WINDOWS, isso é importante
> frisar por causa das barras e do exemplo em si):
>
> esse código lê dois arquivos: "ignorado.txt" contendo apenas a linha:
>
> \pagefile.sys
>
> e "diretorio.txt", contendo apenas a linha:
>
> \*
>
> esse é o código que reproduz o problema:
>
> --------------------8<----------------------
> open(ARQ, '<', 'ignorado.txt') or die "$!\n";
> chomp(my $ignorado = <ARQ>); # aqui eu leio '\pagefile.sys'
> close(ARQ);
>
> open(ARQ, '<', 'diretorio.txt') or die "$!\n";
> chomp(my $dir = <ARQ>);  # aqui eu leio '\*'
> close(ARQ);
> my @lista_expandida = glob($dir);
>
> foreach(@lista_expandida) {
>     print "comparando \"$_\" com \"$ignorado\"...\n";
>     if($_ =~ /^$ignorado/) {
>         print "*** ignorei $_ ***";
>     }
> }
> --------------------8<----------------------
>
> note que coloquei dois print() dentro do foreach() para depurar, e ele simplesmente não
> entra dentro do if()... recebo até a saída:
>
> comparando "\pagefile.sys" com "\pagefile.sys"...
>
> alguém tem idéia do que pode estar acontecendo????
>
> o problema acredito que esteja relacionado com a barra invertida, mas não sei como
> solucioná-lo e não posso retirar a barra...
>
> curiosamente, se tiro o "^" do match dentro do if(), logo que ele compara
> "\pagefile.sys" com "\pagefile.sys" (onde deveria entrar, ele morre com o erro:
>
> Can't find Unicode property definition "a"
>
>
> Qualquer ajuda ou indicação será *muito* bem vinda, especialmente dos monges que usam
> Windows (não é muito a minha praia ;-)
>
> à título de curiosidade, caso possa ajudar:
> ------------------
> This is perl, v5.8.7 built for MSWin32-x86-multi-thread
> (with 7 registered patches, see perl -V for more detail)
> ------------------
>
> []s
>
> breno
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>


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