[Cascavel-pm] Problema em comparar campos de arquivos

Luis Motta Campos luismottacampos em yahoo.co.uk
Domingo Setembro 14 02:44:33 PDT 2008


   Olá, Ronan.


Ronan Eustaquio wrote:
> Então, eu fiz o código abaixo para gerar a base.
 > (...)
> O problema deste código é que ele está gravando os registros de forma
> errada.
> 
> caminho/do/arquivo/comitado1
> ,aprovado
> caminho/do/arquivo/comitado2.txt
> ,draft
> caminho/do/arquivo/comitado.doc
> ,aprovado
> 
> Aí, na próxima vez que este script é executado, dá pau em tudo.
> 
> Espero que vocês tenham entendido e consigam me ajudar.

Eu tomei a liberdade de reescrever o teu código. Por favor, leia e 
aprenda. Atenção: eu não testei o código!!

__CODIGO_NOVO__
my ( $author, $date, undef, @log ) =
     read_from_process( $svnlook, 'info', $repos, '-r', $rev );

my $db_file = do {
     ( my $r = uc $repos ) =~ s{/|SVN}{}g;
     qq{/svn/basedados.$r};
};

# Geracao de Base de dados para analise posterior

# Processar a saida de log.
my %registro_versionado;
foreach (@log) {
     my ( $filename, $status ) =
         m{^#file=([^#]+)#status=(draft|aprovado)};
     $registro_versionado{$filename} = qq{$filename,$status};
}

# Abrir base de dados para buscar registros.
my %registro;
open my $DBFILE, '<', $db_file or die "Can't open $db_file: $!.";
foreach (<$DBFILE>) {
     my ( $filename, $status ) = split qr/,/;
     $registro{$filename} = $status;
}
close $DBFILE or die "Can't close $db_file: $!";

# Neste momento, eu tenho dois hash-tables com praticamente
# os mesmos dados. Assumindo que um arquivo nunca deixa o
# Version Control, eu posso simplesmente juntar os dois
# hash-tables num unico registro e gravar de volta no
# arquivo. Ordem eh importante.
my %registros_atualizados = ( %registro, %registro_versionado );
open my $DBFILE, '>', $db_file or die "Can't open $db_file:$!";
foreach my $file ( sort keys %registros_atualizados ) {
     print $DBFILE $file . ',' . $registros_atualizados{$file} . "\n";
}
close $DBFILE or die "Can't close $db_file: $!";
__CODIGO_NOVO__

Agora, vamos explicar o teu problema: você está lendo nomes de arquivos 
de dois lugares diferentes: um array e um arquivo chamado $db_file.

Quando você lê do array, os nomes de arquivo não contém "\n" (newline), 
e está tudo bem. Mas, quando você lê do arquivo, os nomes de arquivo 
contém "\n" (padrão no perl e no mundo unix). O problema é que você lê 
os nomes, faz suas transformações, mas nunca remove o "\n" do arquivo:

# A merda começa aqui
>  if (open(DBFILE, "< $db_file")) {
>      for my $value (<DBFILE>){
###### Acrescente "chomp $value" aqui:
            chomp $value;
>          $linha = $value;
>          $status = $value;
> 
>          $linha =~ s/,(.*)//gi;
>          $status =~ s/(.*),//gi;
> 
>          $registro{$linha} = $status;
>          # print $linha.",".$registro{$linha}."\n";
>      }
>  close DBFILE or warn "$0: error in closing `$db_file' for appending:$!\n";

Isso deve resolver seu problema. Mas eu recomendo:

1. Use Perl::Tidy;
2. Melhore o teu estilo. Você parece um programador C, não está usando 
nem 10% do potencial do Perl. Ler código de gente mais experiente ajuda 
muito;
3. Nunca, jamais, por motivo nenhum, implemente um "gancho" no commit do 
SVN -- é perigoso e desnecessário: você pode obter a mesma informação a 
partir dos commit logs.

Espero que isso ajude.
Putamplexos.
-- 
Luis Motta Campos is a software engineer,
Perl Programmer, foodie and photographer.


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