2011-08-14 20 views
5

Kullanıcının -o file seçeneğini geçirebileceği bir programda çalışıyorum ve çıktı o dosyaya yönlendirilmelidir. Aksi takdirde, stdout'a gitmeli.Dosya dosyasını açın veya atayın atama

Seçeneği almak için modül getopt uzun kullanıyorum ve bu sorun değil. Sorun, o seçenek ayarlanmamışsa, o dosyaya ya da atama ile bir dosya tanıtıcısı oluşturmak istiyorum. var

if ($opt) { 
    open OUTPUT, ">", $file; 
} else { 
    open OUTPUT, # ??? 
} 

Bu yolla, çünkü daha sonra benim kodda ben sadece can:

print OUTPUT "..."; 

OUTPUT kullanıcı belirtilen bir dosya stdout'u mı yoksa endişe olmadan. Mümkün mü? Burada kötü bir tasarım yapıyorum, lütfen bana bildirin.

+0

İlgili: http://stackoverflow.com/q/6296536#6296773 – daxim

cevap

7

Bu select nasıl kullanılacağına dair iyi bir örnek olacaktır.

use strict; 
use warnings; 
use autodie; 

my $fh; 
if ($opt) { 
    open $fh, '>', $file; 
    select $fh; 
} 

print "This goes to the file if $opt is defined, otherwise to STDOUT." 
+1

Güzel TLP, çok teşekkürler. Hala Perl hakkında öğrenmem gereken birçok şey var ... Ancak, bunun bir süre içinde çalışıp çalışmadığından emin değilim (<>) ', benim durumum değil, sadece düşünüyorum. Bu vakalarda yeniden açılış stdout'u daha iyi bir seçenek gibi görünüyor, çünkü yine de baskıyı etiketlemem gerekecek. – cmre

+0

@cmre Oh, yorumunuzu düzenlediniz. Eh, bu sadece STDOUT yeniden açılması gibi çalışacaktır. STDOUT "foo" 'basmak" print "foo" ile aynıdır, bu nedenle filehandle'ı belirtmeniz gerekmez. Endişenizin ne olduğundan emin değilim, ama rahat hissettiğiniz çözümü kullanmalısınız. – TLP

+0

Evet, sadece düzenledim, üzgünüm. Endişe şu ki, '' '' içinde '' bir şey '' yazarken (<>) {...} ', seçilen dosyaya çıktığında, doğru mu? Ya da belki de, ben sadece Perl ile başlıyorum ve şimdi gerçekten kafa karıştırıcı oluyor: P – cmre

4

open belgelerine bakın. En kolayı, STDOUT'un kendisini yeniden açmanız ve kodunuzda bir dosya tanıtımı kullanmamaktır.

if ($opt) { 
    open(STDOUT, ">", $file); 
} 
... 

print "this goes to $file or STDOUT\n"; 

(tabii denetimi bazı hata ekleyin.)

+0

Teşekkürler Mat, çok daha kolay. – cmre

İlgili konular