[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