我想通過<>運算符讀取數據。默認文件源爲<> in perl
它從標準輸入或從指定爲腳本的ARGS
文件中讀取數據,但是,如果沒有STDIN呈現,也不指定的文件,我想讀從默認的文件路徑數據;
所以,它應該像
my $file = '';
if ($ARGC) { open $file, '<default.txt'; }
while (<$file>) # if no ARGs it should be <>
{
do_all;
}
我想通過<>運算符讀取數據。默認文件源爲<> in perl
它從標準輸入或從指定爲腳本的ARGS
文件中讀取數據,但是,如果沒有STDIN呈現,也不指定的文件,我想讀從默認的文件路徑數據;
所以,它應該像
my $file = '';
if ($ARGC) { open $file, '<default.txt'; }
while (<$file>) # if no ARGs it should be <>
{
do_all;
}
<>
運算符從@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;
你是對的!另一個好的字符串是@ARGV,「default.txt」如果!@ARGV和-t STDIN; – xoid 2014-12-06 09:48:46
但是,如果沒有STDIN呈現,也不指定的文件,我想讀從默認的文件路徑
我想,通過數據「沒有STDIN「你指的是perl上沒有管道STDIN
push @ARGV, "default.txt" if [email protected]V and -t STDIN;
請注意,由於'!-t STDIN'的檢查,如果您嘗試使用例如管道向其傳輸某些內容,則不會從標準輸入讀取數據。 'perl script.pl
@IlmariKaronen,但它會讀取管道的情況下。 'perl -E'表示1 *!-t STDIN' etc/passwd'和'echo | perl -E'說1 *!-t STDIN'' – 2014-12-06 09:31:10
是的,如果stdin不是tty,那麼你的代碼將從'default.txt'中讀取,例如,如果你向它傳遞某些東西。我只是說這可能與OP想要的相反,你可能應該從'-t'之前刪除'!'。 – 2014-12-06 09:36:38
@ARGV = 'default.txt'
if [email protected] && !defined(fileno(STDIN));
從指定的文件進行讀取或
如果打開,則從STDIN讀取,或者從default.txt
讀取
。
上述-t
測試將失敗script < file
和foo | script
。
你的意思是「沒有STDIN呈現」是什麼意思? – 2014-12-06 09:23:57
運行「cron」作業時(至少在舊版Solaris中)沒有STDIN。 – jimtut 2014-12-06 14:59:25