我想從默認輸入中讀取數據是否傳入或提供了文件,但如果沒有提供,我想提供默認值while(<>)
來執行。基於命令行參數的Perl設置文件句柄
僞代碼:
if(!<>){
<> = system("ls | ./example.pl");
}
while(<>){
...
...
...
}
我想從默認輸入中讀取數據是否傳入或提供了文件,但如果沒有提供,我想提供默認值while(<>)
來執行。基於命令行參數的Perl設置文件句柄
僞代碼:
if(!<>){
<> = system("ls | ./example.pl");
}
while(<>){
...
...
...
}
你 「如果數據是在管道」 刁難。這很容易說
if ([email protected]) {
@ARGV = ("somedefault");
}
while (<>) {
...
}
,如果沒有文件名在命令行給出的,這將在「somedefault」工作 - 但這意味着你永遠不會從標準輸入讀取Perl的默認值,如果沒有任何文件名上命令行。
一種可能的妥協是使用-t operator猜測標準輸入是否是終端:
if ([email protected] && -t STDIN) {
@ARGV = ("somedefault");
}
如果沒有在命令行和標準輸入連接到終端的文件名將使用「somedefault」 ,但如果沒有文件名並且stdin從文件或管道重定向,它將使用stdin。這有點神奇(可能令人討厭),但是按你的要求。
如何嘗試從<>
中讀取,然後在沒有讀取任何內容時回到默認值?
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 - 它表示最近的文件句柄讀取的「當前」的行號。如果未定義,則從<>
沒有任何可讀的內容。
你實施的哪一部分讓你失望? – 2012-01-27 01:26:12
這似乎不是有效的。我想設置<>。此外,測試('if(!<>)')似乎不正確。 – Chris 2012-01-27 01:27:09
@Chris的權利,沒有一個是真的明智的。 '<>'是從文件讀取的運算符。你不能設置它,並且執行'if(!<>)'從某處讀取一行並測試*那行*是真還是假。 – hobbs 2012-01-27 01:32:22