2013-04-17 13 views
6

Mam skrypt Perla, który otwiera plik i zapisuje w nim pewne dane. Czasami ten plik ma uprawnienia tylko do odczytu na niektórych komputerach. W takich przypadkach skrypt obecnie umiera, ponieważ nie mógł otworzyć pliku. Moim wymaganiem jest, że w takich przypadkach chcę, aby mój skrypt był kontynuowany i zamiast zapisywać zawartość w pliku, umieszcza go w STDOUT. Będę używał warn zamiast matrycy, ale chcę wiedzieć, czy mogę alias mój uchwyt pliku FILE1 do STDOUT tak, że nie muszę modyfikować pozostałego kodu, powodem jest mój kod rzeczywisty print FILE1 <> jest obecny w wielu miejscach i nie jest możliwe do umieszczenia wszędzie warunków if\else. Chcę, aby nazwa ta była alias FILE1 do STDOUT takie, że polecenie print wypisze je w STDOUT lub zapisze w pliku w zależności od wartości ustawionej w FILE1 uchwyt pliku. Czy to możliwe, używając perla?Uchwyt pliku aliasu do STDOUT w perlu

$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

Możliwy duplikat http://stackoverflow.com/questions/3807231/how-can- i-test-if-i-can-write-to-a filehandle – devnull

Odpowiedz

13

Można to zrobić z *FILE1 = STDOUT;.

Zmienne o numerze * nazywane są typeglobs. Przeczytaj o nich here.

Można też rozpocząć korzystanie lexical file handles

ten sposób chciałbym rozwiązać problem:

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

Właśnie dodałem ten kod po moim otwartym oświadczeniu i zadziałało. Czy mógłbyś mi powiedzieć, jak mogę sprawdzić, czy otwarcie pliku otwiera się pomyślnie, czy nie. Teraz nawet jeśli plik jest dostępny, to po prostu drukowanie tekstu w STDOUT, a NIE w pliku. – sarbjit

+2

'open (FILE1," >> $ file ") lub * FILE1 = STDOUT;' byłoby bardzo prostym sposobem. –

+0

@ dan1111 jak odróżnić plik FILE1 wskazujący na plik $ od pliku FILE1 wskazującego na STDOUT? Zastanawiam się tylko, ponieważ zamykanie STDOUT może nie być dobrym pomysłem. – tauli

Powiązane problemy