<div dir="ltr"><br>
<div class="gmail_quote">2008/9/14 Luis Motta Campos <span dir="ltr"><<a href="mailto:luismottacampos@yahoo.co.uk">luismottacampos@yahoo.co.uk</a>></span><br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"> Olá, Ronan.
<div class="Ih2E3d"><br><br><br>Ronan Eustaquio wrote:<br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Então, eu fiz o código abaixo para gerar a base.<br></blockquote>> (...)<br></div>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">O problema deste código é que ele está gravando os registros de forma<br>errada.<br><br>
<div class="Ih2E3d">caminho/do/arquivo/comitado1<br>,aprovado<br>caminho/do/arquivo/comitado2.txt<br>,draft<br>caminho/do/arquivo/comitado.doc<br>,aprovado<br><br>Aí, na próxima vez que este script é executado, dá pau em tudo.<br>
<br>Espero que vocês tenham entendido e consigam me ajudar.<br></div></blockquote><br>Eu tomei a liberdade de reescrever o teu código. Por favor, leia e aprenda. Atenção: eu não testei o código!!<br><br>__CODIGO_NOVO__<br>
my ( $author, $date, undef, @log ) =
<div class="Ih2E3d"><br> read_from_process( $svnlook, 'info', $repos, '-r', $rev );<br></div></blockquote>
<div> </div>
<div> </div>
<div><font face="courier new,monospace">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 !!!</font></div>
<div> </div>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">
<div class="Ih2E3d"><span id=""></span><br></div>my $db_file = do {<br> ( my $r = uc $repos ) =~ s{/|SVN}{}g;<br> qq{/svn/basedados.$r};
<div class="Ih2E3d"><br>};<br><br># Geracao de Base de dados para analise posterior<br><br></div>
<div class="Ih2E3d"># Processar a saida de log.<br></div>my %registro_versionado;<br>foreach (@log) {<br> my ( $filename, $status ) =<br> m{^#file=([^#]+)#status=(draft|aprovado)};<br> $registro_versionado{$filename} = qq{$filename,$status};
<div class="Ih2E3d"><br>}<br><br># Abrir base de dados para buscar registros.<br></div>my %registro;<br>open my $DBFILE, '<', $db_file or die "Can't open $db_file: $!.";<br>foreach (<$DBFILE>) {<br>
my ( $filename, $status ) = split qr/,/;<br> $registro{$filename} = $status;<br>}<br>close $DBFILE or die "Can't close $db_file: $!";<br><br># Neste momento, eu tenho dois hash-tables com praticamente<br>
# os mesmos dados. Assumindo que um arquivo nunca deixa o<br># Version Control, eu posso simplesmente juntar os dois<br># hash-tables num unico registro e gravar de volta no<br># arquivo. Ordem eh importante.<br>my %registros_atualizados = ( %registro, %registro_versionado );<br>
open my $DBFILE, '>', $db_file or die "Can't open $db_file:$!";<br>foreach my $file ( sort keys %registros_atualizados ) {<br> print $DBFILE $file . ',' . $registros_atualizados{$file} . "\n";<br>
}<br>close $DBFILE or die "Can't close $db_file: $!";<br>__CODIGO_NOVO__<br><br>Agora, vamos explicar o teu problema: você está lendo nomes de arquivos de dois lugares diferentes: um array e um arquivo chamado $db_file.<br>
<br>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:<br>
<br># A merda começa aqui
<div class="Ih2E3d"><br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"> if (open(DBFILE, "< $db_file")) {<br> for my $value (<DBFILE>){<br></blockquote></div>
###### Acrescente "chomp $value" aqui:<br> chomp $value;
<div class="Ih2E3d"><br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"> $linha = $value;<br> $status = $value;<br><br> $linha =~ s/,(.*)//gi;<br> $status =~ s/(.*),//gi;<br>
<br> $registro{$linha} = $status;<br> # print $linha.",".$registro{$linha}."\n";<br> }<br> close DBFILE or warn "$0: error in closing `$db_file' for appending:$!\n";<br></blockquote>
<br></div>Isso deve resolver seu problema. Mas eu recomendo:<br><br>1. Use Perl::Tidy;<br>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;<br>
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.<br><br>Espero que isso ajude.<br>Putamplexos.<br>
<font color="#888888">-- <br>Luis Motta Campos is a software engineer,<br>Perl Programmer, foodie and photographer.<br>_______________________________________________<br>Cascavel-pm mailing list<br><a href="mailto:Cascavel-pm@pm.org" target="_blank">Cascavel-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/cascavel-pm" target="_blank">http://mail.pm.org/mailman/listinfo/cascavel-pm</a><br></font></blockquote></div><br><br clear="all"><br>-- <br>"o animal satisfeito dorme". - Guimarães Rosa<br>
</div>