2013-04-17 8 views
6

Ho uno script perl che apre un file e scrive alcuni dati in esso. A volte questo file sta leggendo solo le autorizzazioni su alcune macchine. Per questi casi, al momento la sceneggiatura non è più in grado di aprire il file. Il mio requisito è che in questi casi, voglio che il mio script continui e invece di scrivere il contenuto nel file, lo inserisce in STDOUT. Userò il warn invece di morire, ma voglio sapere posso alias il mio file gestire FILE1 a STDOUT tale che non ho bisogno di modificare il codice rimanente, la ragione essendo nel mio codice reale print FILE1 <> è presente in molti posti e non è possibile per me di mettere le condizioni if\else ovunque. Voglio che io sia alias FILE1 a STDOUT in modo tale che l'istruzione di stampa lo stamperà in STDOUT o scriverà in file a seconda del valore impostato nel filehandle FILE1. È possibile usare perl?L'handle del file alias in STDOUT in perl

$file = "testfile.txt"; 
open(FILE1, ">> $file") or die "Can not read file $file: $! \n"; 
print FILE1 "Line1 \n"; 
print FILE1 "Line2 \n"; 
print FILE1 "Line3 \n"; 
print FILE1 "Line4 \n"; 
close FILE1 
+0

Eventuali duplicati di http://stackoverflow.com/questions/3807231/how-can- I-test-if-i-can-write-to-a-filehandle – devnull

risposta

13

È possibile farlo con *FILE1 = STDOUT;.

Le variabili con un * nella parte anteriore sono denominate typeglobs. Leggi su di loro here.

Si consiglia inoltre di iniziare a utilizzare lexical file handles

Questo è come vorrei risolvere il problema:

use strict; 
use warnings; 

my $file = "testfile.txt"; 
my $succ = open(my $fh , '>>', $file); 

$fh = *STDOUT unless $succ; 

print $fh "Line1 \n"; 
print $fh "Line2 \n"; 
print $fh "Line3 \n"; 
print $fh "Line4 \n"; 

close $fh if $succ; # don't close STDOUT 
+0

Ho appena aggiunto questo codice dopo la mia dichiarazione aperta e ha funzionato. Potresti dirmi come potrei controllare se il filehandle è stato aperto in modo succesivo o meno. Al momento anche se il file è accessibile, è sufficiente stampare il testo in STDOUT e NON in file. – sarbjit

+2

'open (FILE1," >> $ file ") o * FILE1 = STDOUT;' sarebbe un modo molto semplice. –

+0

@ dan1111 come distinguere un FILE1 che punta a $ file da FILE1 che punta a STDOUT? Mi chiedo solo perché chiudere STDOUT potrebbe non essere una buona idea. – tauli