[Cascavel-pm] Problema em comparar campos de arquivos
Solli Honorio
shonorio em gmail.com
Terça Setembro 16 17:25:39 PDT 2008
2008/9/14 Luis Motta Campos <luismottacampos em yahoo.co.uk>
> 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 );
>
Luis, se você me permite, eu não gosto muito disto, a menos que o cara saiba
exatamente o que está fazendo... se o log for grande, isto poderá ser um
problema !!!
>
> 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.
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
--
"o animal satisfeito dorme". - Guimarães Rosa
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20080916/1f3cd1eb/attachment-0001.html>
Mais detalhes sobre a lista de discussão Cascavel-pm