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

Giuliani Deon Sanches giulianisanches em gmail.com
Quarta Setembro 9 05:21:54 PDT 2009


2009/9/9 Donato Azevedo <donatoaz em gmail.com>:
> 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
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>

A diferença teorica de '>' e '+>' eu entendi já na leitura da
documentação. A questão era mais pelo fato de que eu abri o arquivo
com '>' retornei o handle para outra função e essa fez a leitura dele
do inicio ao fim sem problemas como se eu tivesse aberto o arquivo com
'+>', entende ? :)

Agradeço pela questão 3, vou estudar o pedaço de código e tentar usar
ele para o que preciso.

[]'s

-- 
twitter.com/giulianisanches
giulianisanches.blogspot.com


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