2014-12-06 84 views
4

我想通過<>運算符讀取數據。默認文件源爲<> in perl

它從標準輸入或從指定爲腳本的ARGS

文件中讀取數據,但是,如果沒有STDIN呈現,也不指定的文件,我想讀從默認的文件路徑數據;

所以,它應該像

my $file = ''; 
if ($ARGC) { open $file, '<default.txt'; } 
while (<$file>) # if no ARGs it should be <> 
{ 
    do_all; 
} 
+2

你的意思是「沒有STDIN呈現」是什麼意思? – 2014-12-06 09:23:57

+0

運行「cron」作業時(至少在舊版Solaris中)沒有STDIN。 – jimtut 2014-12-06 14:59:25

回答

4

<>運算符從@ARGV讀取輸入文件名的列表。因此,建立一個默認的輸入文件名的方法就是檢查是否@ARGV是空的,如果是的話,把你的默認文件名到它:

push @ARGV, "default.txt" unless @ARGV; 

我不知道你是什麼通過「無STDIN呈現」的意思,但如果你的意思是你想你的腳本由foo.txt而不是default.txt如果援引爲如讀:

perl script.pl < foo.txt 

或:

cat foo.txt | perl script.pl 

然後您通過使用-t file test來檢查STDIN是否從終端讀取數據。如果STDIN一個TTY,它是最有可能是管道或文件,因此你應該嘗試從中讀取數據:

push @ARGV, "default.txt" unless @ARGV or !-t STDIN; 
+1

你是對的!另一個好的字符串是@ARGV,「default.txt」如果!@ARGV和-t STDIN; – xoid 2014-12-06 09:48:46

2

但是,如果沒有STDIN呈現,也不指定的文件,我想讀從默認的文件路徑

我想,通過數據「沒有STDIN「你指的是perl上沒有管道STDIN

push @ARGV, "default.txt" if [email protected]V and -t STDIN; 
+0

請注意,由於'!-t STDIN'的檢查,如果您嘗試使用例如管道向其傳輸某些內容,則不會從標準輸入讀取數據。 'perl script.pl 2014-12-06 09:23:22

+0

@IlmariKaronen,但它會讀取管道的情況下。 'perl -E'表示1 *!-t STDIN' 2014-12-06 09:31:10

+0

是的,如果stdin不是tty,那麼你的代碼將從'default.txt'中讀取,例如,如果你向它傳遞某些東西。我只是說這可能與OP想要的相反,你可能應該從'-t'之前刪除'!'。 – 2014-12-06 09:36:38

1
@ARGV = 'default.txt' 
    if [email protected] && !defined(fileno(STDIN)); 

從指定的文件進行讀取或
如果打開,則從STDIN讀取,或者從default.txt讀取

上述-t測試將失敗script < filefoo | script

+0

'perl -E'表示1 *!-t STDIN' 2014-12-06 21:27:28

+0

對於那些想知道@ mpapec的代碼是做什麼的,它證明了我聲稱'-t'不正確:即使當STDIN是打開。 – ikegami 2014-12-07 03:41:20

+0

@mpapec,顯然。但不清楚它的含義。 – ikegami 2014-12-07 06:00:15