[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