2013-04-17 5 views
6

Ich habe ein Perl-Skript, das eine Datei öffnet und einige Daten darin schreibt. Manchmal hat diese Datei auf einigen Computern nur Leseberechtigungen. In solchen Fällen stirbt das Skript zur Zeit ab, da es die Datei nicht öffnen konnte. Meine Anforderung ist, dass ich in solchen Fällen möchte, dass mein Skript fortfährt und anstatt den Inhalt in eine Datei zu schreiben, legt es in STDOUT ab. Ich werde die anstelle von sterben, aber ich möchte wissen, kann ich Alias ​​meine Datei behandeln FILE1 zu STDOUT so, dass ich muss nicht den restlichen Code ändern, Grund in meinem tatsächlichen Code ist print FILE1 <> ist an vielen Stellen vorhanden und ist nicht möglich für mich, if\else Bedingungen überall zu setzen. Ich möchte, dass ich Alias ​​FILE1 zu STDOUT so dass print-Anweisung wird es entweder in STDOUT ausgeben oder in Datei schreiben je nach dem Wert in FILE1 Dateihandle gesetzt. Ist es möglich, Perl zu verwenden?Alias-Datei-Handle zu 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

Mögliche Duplikat http://stackoverflow.com/questions/3807231/how-can- i-test-wenn-ich-kann-schreibe-in-ein-Dateihandle – devnull

Antwort

13

Sie können mit *FILE1 = STDOUT; so tun.

Variablen mit einem * vorne heißen typeglobs. Lesen Sie über sie here.

Sie können auch lexical file handles

Dies ist mit gestartet werden soll, wie ich das Problem lösen würde:

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

Ich habe diesen Code nur nach meiner open-Anweisung hinzugefügt und es hat funktioniert. Können Sie mir bitte sagen, wie ich überprüfen könnte, ob der Dateihandle erfolgreich geöffnet ist oder nicht. Auch jetzt, wenn die Datei zugänglich ist, wird nur der Text in STDOUT und NICHT in der Datei gedruckt. – sarbjit

+2

'öffnen (FILE1," >> $ file ") oder * FILE1 = STDOUT;' wäre ein sehr einfacher Weg. –

+0

@ dan1111 Wie würden Sie eine FILE1 unterscheiden, die auf $ datei zeigt, von FILE1, die auf STDOUT zeigt? Ich frage mich nur, denn das Schließen von STDOUT ist vielleicht keine gute Idee. – tauli