2013-04-17 16 views
6

Bir dosya açan ve içine veri yazabilen bir perl betiği sahibiyim. Bazen bu dosya sadece bazı makinelerde izinleri okuyor. Bu gibi durumlarda, şu anda betik dosyayı açamadığı için ölür. Benim şartım, bu gibi durumlarda, script'imin devam etmesini ve içeriklerini dosyaya yazmak yerine STDOUT'a yerleştirmesini istiyorum. Ben warn die yerine kullanacağım, ama ben bilmek istiyorum benim dosya tanıtıcı STDOUT için geri kalan kod değiştirmek gerek yok, benim gerçek kod print FILE1 <> var olmak pek çok yerde var ve neden yok her yerde if\else koşullarını koymak için mümkün. FILE1 ile STDOUT arasındaki adresi yazdıracağım, baskı ifadesinin STDOUT içinde çıkacağını veya FILE1 dosya kümesinde ayarlanan değere bağlı olarak dosyaya yazacağını istiyorum. Perl kullanarak mümkün mü?Alias ​​dosya tanıtıcısı STDOUT içinde perl ile

$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

Olası yinelenen http://stackoverflow.com/questions/3807231/how-can-:

Ayrıca bu i sorununuzu çözecek nasıl lexical file handles

kullanmaya başlamak isteyebilir i-test-if-i-can-write-to-a-filehandle – devnull

cevap

13

*FILE1 = STDOUT; ile yapabilirsiniz.

Önünde * bulunan değişkenler, typeglobs olarak adlandırılır. Onlar hakkında bilgi edinin here. arasında

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

Açık kodumdan sonra bu kodu ekledim ve işe yaradı. Filehandle'ın başarılı bir şekilde açılıp açılmadığını nasıl kontrol edebileceğimi söyler misiniz? Şu anda dosya erişilebilir olsa bile, sadece STDOUT ve NOT dosya içindeki metni basıyor. – sarbjit

+2

'açık (FILE1," >> $ dosya ") veya * FILE1 = STDOUT;' 'çok basit bir yol olurdu. –

+0

@ dan1111 FILE1 öğesinden STDOUT değerine işaret eden bir FILE1 işaretini nasıl ayırt edersiniz? Sadece merak ediyorum çünkü STDOUT'u kapatmak iyi bir fikir olmayabilir. – tauli

İlgili konular