[Cascavel-pm] Dúvidas quanto as opções '>' e '+>' para abertura de arquivos

Donato Azevedo donatoaz em gmail.com
Quarta Setembro 9 05:04:21 PDT 2009


2009/9/9 Giuliani Deon Sanches <giulianisanches em gmail.com>:
> Ontem, depois de uma boa dose de estudos, resolvi botar em prática e
> ajustar algumas coisas em um "scriptzinho" que estou fazendo.
>
> Em determinado momento, em uma função, retornei um handle de arquivo
> aberto com '>' que tinha acabado de ser escrito para outra função que
> fez a leitura dele, do inicio ao fim, normalmente.
>
> 1) Qual a principal diferença entre o '>' e o '+>' ?

De acordo com o perldoc:
You can put a '+' in front of the '>' or '<' to indicate that you want
both read and write access to the file; thus '+<' is almost always
preferred for read/write updates--the '+>' mode would clobber the file
first. You can't usually use either read-write mode for updating
textfiles, since they have variable length records. See the -i switch
in perlrun for a better approach.

Isso já te leva à terceira pergunta

> 3) Atualmente possuo um arquivo que vem, digamos, 'sujo'. Eu abro e
> percorro ele e conforme um determinado padrão eu escrevo (e ajusto) as
> linhas válidas em outro arquivo. Algúem teria um exemplo de como fazer
> isso somente com um arquivo, ou seja, ir percorrendo ele e elminiando
> o que eu não preciso além de fazer aglumas correções em linhas que são
> consideradas válidas para o meu propósito diretamente no arquivo de
> origem ? Em buscas na internet (e talvez não tenha buscado
> corretamente) achei exemplos apenas da forma como faço, com dois
> arquivos.

Isto se chama "inplace editing" e o switch -i do perl realiza esta operação

No perlrun (http://perldoc.perl.org/perlrun.html) você vê que:

perl -p -i.orig -e "s/foo/bar/; ... "

é o mesmo que

    #!/usr/bin/perl
    $extension = '.orig';
    LINE: while (<>) {
	if ($ARGV ne $oldargv) {
	    if ($extension !~ /\*/) {
		$backup = $ARGV . $extension;
	    }
	    else {
		($backup = $extension) =~ s/\*/$ARGV/g;
	    }
	    rename($ARGV, $backup);
	    open(ARGVOUT, ">$ARGV");
	    select(ARGVOUT);
	    $oldargv = $ARGV;	
         }
         s/foo/bar/;
    }    continue {
	print;
	# this prints to original filename
    }
    select(STDOUT);

Cheers!
-- 
Donato Azevedo


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