POD2-IT
view release on metacpan or search on metacpan
IT/perlfaq5.pod view on Meta::CPAN
$vecchio_fh = select(OUTPUT_HANDLE);
$| = 1;
select($vecchio_fh);
Alcune espressioni idiomatiche possono gestirlo in una singola istruzione:
select((select(OUTPUT_HANDLE), $| = 1)[0]);
$| = 1, select $_ for select OUTPUT_HANDLE;
Alcuni moduli offrono un accesso orientato agli oggetti agli handle e alle
loro variabili, sebbene possa essere eccessivo se questa E<egrave> l'unica
cosa per cui li usate. Potete usare IO::Handle:
use IO::Handle;
open(DEV, ">/dev/printer"); # ma E<egrave> questa?
DEV->autoflush(1);
oppure IO::Socket:
use IO::Socket; # questa E<egrave> tipo una pipe?
my $sock = IO::Socket::INET->new( 'www.esempio.com:80' );
$sock->autoflush();
=head2 Come si cambia una riga di un file/cancella una riga di un file/inserisce una riga nel mezzo di un file/aggiunge all'inizio di un file?
X<file, editing>
Usate il modulo Tie::File, che E<egrave> incluso nella distribuzione
standard fin dal Perl 5.8.0.
=head2 Come si conta il numero di righe di un file?
X<file, contare righe> X<righe> X<riga>
Un modo efficente ed elegante E<egrave> quello di contare i caratteri di
ritorno a capo nel file. Il seguente programma usa una caratteristica di
tr///, come viene documentata in L<perlop>. Se le righe del vostro file di
testo non terminano con il ritorno a capo, il file non E<egrave>
propriamente un file di testo, quindi il programma potrebbe restiruire
meno righe di quello che vi aspettereste.
$linee = 0;
open(FILE, $nomefile) or die "Non posso aprire '$nomefile': $!";
while(sysread FILE, $buffer, 4096) {
$linee += ($buffer =~ tr/\n//);
}
close FILE;
Questo presuppone che non si facciano giochetti con l'uso di tr sul ritorno
a capo.
=head2 Come posso usare l'opzione del Perl C<-i> dall'interno di un programma?
X<-i> X<in-place>
C<-i> imposta il valore della variabile Perl C<$^I>, che a sua volta influisce
sul comportamento di C<< <> >>; consultate L<perlrun> per maggiori dettagli.
Modificando direttamente le variabili appropriate, potete ottenere lo stesso comportamento
all'interno di un grosso programma. Per esempio:
# ...
{
local($^I, @ARGV) = ('.orig', glob("*.c"));
while (<>) {
if ($. == 1) {
print "Questa linea dovrebbe apparire in cima ad ogni file\n";
}
s/\b(p)earl\b/${1}erl/i; # Corretto un errore di battitura, mantiene le maiuscole/minuscole
print;
close ARGV if eof; # Reimposta $.
}
}
# $^I e @ARGV qua ritornano ai loro vecchi valori
Questo blocco modifica tutti i file C<.c> nella directory corrente,
lasciando una copia del dato originale da qualunque file in un nuovo
file C<.c.orig>.
=head2 Come posso copiare un file?
X<copy> X<file, copy>
(contributo di brian d foy)
Usate il modulo File::Copy. E<Egrave> disponibile con il Perl e puE<ograve>
fare una copia effettiva attraverso i filesystem e fa la sua magia in maniera
portabile.
use File::Copy;
copy( $originale, $nuova_copia ) or die "Copia fallita: $!";
Se non potete usare File::Copy, dovrete farlo voi stessi: aprire
il file originale, aprire il file di destinazione, poi scrivere
sul file di destinazione quello che avete letto nell'originale.
=head2 Come si crea un file temporaneo?
X<file, temporaneo>
Se non vi serve conoscere il nome del file, potete usare C<open()> con
C<undef> al posto del nome del file. La funzione C<open()> crea un file
temporaneo anonimo.
open my $tmp, '+>', undef or die $!;
Altrimenti, potete usare il modulo File::Temp.
use File::Temp qw/ filetemp dirtemp /;
$dir = dirtemp( CLEANUP => 1 );
($fh, $nomefile) = filetemp( DIR => $dir );
# oppure, se non avete bisogno del nome del file
$fh = filetemp( DIR => $dir );
File::Temp E<egrave> un modulo standard fin dal Perl 5.6.1. Se avete
installato un Perl abbastanza recente, usate il metodo di classe
C<new_tempfile> dal modulo IO::File per ottenere un file aperto in
lettura e scrittura. Usate quanto segue se non avete la necessitE<agrave>
di sapere il nome del file:
use IO::File;
$fh = IO::File->new_tmpfile()
( run in 1.542 second using v1.01-cache-2.11-cpan-5e09290becf )