[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