2012-01-27 75 views
2

我想從默認輸入中讀取數據是否傳入或提供了文件,但如果沒有提供,我想提供默認值while(<>)來執行。基於命令行參數的Perl設置文件句柄

僞代碼:

if(!<>){ 
    <> = system("ls | ./example.pl"); 
} 

while(<>){ 
... 
... 
... 
} 
+0

你實施的哪一部分讓你失望? – 2012-01-27 01:26:12

+0

這似乎不是有效的。我想設置<>。此外,測試('if(!<>)')似乎不正確。 – Chris 2012-01-27 01:27:09

+0

@Chris的權利,沒有一個是真的明智的。 '<>'是從文件讀取的運算符。你不能設置它,並且執行'if(!<>)'從某處讀取一行並測試*那行*是真還是假。 – hobbs 2012-01-27 01:32:22

回答

5

你 「如果數據是在管道」 刁難。這很容易說

if ([email protected]) { 
    @ARGV = ("somedefault"); 
} 

while (<>) { 
    ... 
} 

,如果沒有文件名在命令行給出的,這將在「somedefault」工作 - 但這意味着你永遠不會從標準輸入讀取Perl的默認值,如果沒有任何文件名上命令行。

一種可能的妥協是使用-t operator猜測標準輸入是否是終端:

if ([email protected] && -t STDIN) { 
    @ARGV = ("somedefault"); 
} 

如果沒有在命令行標準輸入連接到終端的文件名將使用「somedefault」 ,但如果沒有文件名並且stdin從文件或管道重定向,它將使用stdin。這有點神奇(可能令人討厭),但是按你的要求。

+0

當我嘗試用'system(「ls」)替換'(某些默認值)'時,終端將永遠運行。我把它弄錯了嗎?我也嘗試過「ls | ./ctime」,但似乎無限遞歸。 – Chris 2012-01-27 03:37:17

+1

這些都沒有意義。 ''ls |「'也許有道理。 – hobbs 2012-01-27 03:56:01

4

如何嘗試從<>中讀取,然後在沒有讀取任何內容時回到默認值?

while (my $line = <>) 
{ 
    do_stuff($line); 
} 

# if no lines were read, fall back to default data source 
if (not $.) 
{ 
    while (my $line = <SOMETHING_ELSE>) 
    { 
      do_stuff($line); 
    } 
} 

您可以閱讀有關$.變量here, at perldoc perlop - 它表示最近的文件句柄讀取的「當前」的行號。如果未定義,則從<>沒有任何可讀的內容。