2010-09-19 98 views
5

Perl::Critic::Policy::InputOutput::ProhibitExplicitStdin爲什麼要在Perl中使用<ARGV>或<>代替<STDIN>?

引用Perl有一個有益魔法文件句柄名爲* ARGV是檢查命令行,如果有任何參數,打開並讀取那些爲文件。如果沒有參數,* ARGV的行爲與* STDIN相反。如果你想創建一個從STDIN讀取的程序,這種行爲幾乎總是你想要的。這通常是寫在以下兩種等價形式之一:

while (<ARGV>) { 
    # ... do something with each input line ... 
} 
# or, equivalently: 
while (<>) { 
    # ... do something with each input line ... 
} 
  • 是它「只是一個約定」,還是有一些充分的理由不使用<STDIN>

我覺得<STDIN>讓我的代碼的意圖不是使用<><ARGV>更加清晰。

我的代碼的流程是這樣的

my @inp = <STDIN>; 
my $len = $inp[0]; 

... 

for(my $i = 0; $i < ($len + 0); $i++) { 
    my @temp = split (' ', $inp[$i]); 
    ... 
} 

回答

5

這是因爲使用<ARGV>將使用戶要麼指定文件從作爲參數,或管道的東西讀入標準輸入,同時指定沒有參數。如果使用<STDIN>,則只有管道可以工作。

當然,由您決定是否認爲人們可以將文件指定爲命令行參數,但這是很多程序支持的,因此可能值得考慮。

+0

感謝。如果這是唯一的原因,那麼我覺得''更好。 – Lazer 2010-09-19 12:22:57

+1

@Lazer:這不是「更好」,它對你使用該程序的方式施加限制。爲什麼不必要地這樣做? – Ether 2010-09-19 17:43:46

+0

Perl :: Critic是基於「Perl最佳實踐」一書的,它簡單地陳述:「避免使用* STDIN,除非你確實是這個意思。」給出的理由是上述答案的更長版本。如果你確實意味着只有STDIN會執行,則不會接受命令行參數 - 然後使用顯式STDIN。 – jmanning2k 2010-09-20 20:06:39

6

你使用那個你想做的事。有關ARGV文件句柄的說明,請參見perlvarARGV也從您在命令行上指定的文件名讀取。也許你想要那個功能,也許你不需要。

而且,你不必做Perl :: Critic所說的。許多這些政策是一小羣人的意見。如果你只想明確地從STDIN讀取,那就是你需要做的。撰寫批評政策的人不在這裏說明你需要做什麼。提出這樣的問題在沒有其應用背景的情況下幾乎毫無意義。一般規則僅僅是一般性的,在討論具體案例時會被打破。

我不確定你爲什麼認爲你的意圖比STDIN更清楚,因爲你沒有告訴我們你的意圖。代碼幾乎從來沒有爲自己說話,因爲我們傾向於編碼解決方案,而不是說明問題。解決方案可能不是正確的。

在你的情況,我覺得這個代碼更加清晰,因爲它是用Perl編寫的,而不是的C語言你使用:)

chomp(my $length = <STDIN>); 

my $count = 0; 
while (<STDIN>) { 
    last if $count++ > $lines_to_read; 

    my @temp = split ' '; 
    ...; 
    } 
相關問題