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 )