[Cascavel-pm] problema em match de arquivos

Fabiano Reese Righetti frighetti em cascavel.pm.org
Terça Junho 13 08:50:37 PDT 2006


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

    O problema é o '\' que contém dentro da variável $ignorado é
interpretado pelo match.

    Esse problema pode ser solucionado com um:

$ignorado =~ s/\\([a-z])/\\\\$1/g;

Abraços,
--
Fabiano Reese Righetti


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