2017-07-19 41 views
-3

我有了這個Perl腳本:Perl腳本不打印<STDIN>多次

#!/usr/bin/perl 
use strict; 
use warnings; 

print <STDIN>, "\n"; 
print <STDIN>, "\n"; 
print <STDIN>, "\n"; 
print <STDIN>, "\n"; 
print <STDIN>, "\n"; 

而且我路過「你好」到腳本的標準輸入:

echo "Hello" | perl test.pl 

我期望它打印「Hello」五次,但它只打印「Hello」,後面跟着五個換行符。任何人都可以解釋爲什麼這不會按預期工作?

+1

perl是文件描述符,每個標準輸入只能讀取一次。 –

+0

嗯......我認爲將''分配給標量變量會更有意義。我怎麼能不止一次讀這個? – alex

+6

這就是管道的工作原理。讀完之後,它不再存在了。實際上這就是文件的工作方式 - 它們有一個結束,當你到達最後時,重複讀取操作不會跳回到開頭,即使在有能力返回的文件上也是如此。你知道什麼語言,你可以反覆閱讀相同的輸入,只需再次說「閱讀」? –

回答

5
print <STDIN>, "\n"; 

<STDIN>(即readline(STDIN))「在列表上下文讀取到達,並返回行的列表,直到結束文件」。

在你的程序中,第一print因此打印所有行從STDIN讀取。

根據定義,從STDIN開始沒有更多行,因爲列表上下文中的<STDIN>讀取了所有需要讀取的內容。

如果你想從STDIN讀取連續五線,並打印出來,你需要:

print scalar <STDIN>; 
print scalar <STDIN>; 
print scalar <STDIN>; 
print scalar <STDIN>; 
print scalar <STDIN>; 

根據定義,符合換行符結束。如果你不刪除它,就沒有必要去打另一個。

它更直觀<STDIN>表示的值在內存中的某個地方舉行一次它的管道輸送到腳本

你的程序中沒有說明存儲從STDIN讀取輸入。它所做的只是讀取STDIN上的所有可用內容,將其全部打印出來並丟棄。

如果您想存儲從STDIN讀取的所有內容,則必須明確地執行此操作。這就是計算機程序的工作原理:它們完全按照他們所說的去做。想象一下,如果計算機程序根據寫作或運行人員的直覺做了不同的事情,那會是什麼樣的災難。

當然,來自STDIN的數據可能是無限的。在這種情況下,把它存儲在某個地方並不實際。

+0

這使得更多的意義 - 我不知道''是'readline(STDIN)'的別名。謝謝! – alex

-1

如果你想循環打印文本的時候一個用戶自定義號碼, 你可以使用一個做,而像這樣的循環:

#!/usr/bin/env perl 
#Program: stdin.pl 
use strict; 
use warnings; 
use feature 'say'; # like print but automatic ending newline. 

my $i = 1; # Our incrementer. 
my $input; # Our text from standard input that we want to loop. 
my $total; # How many times we want to print the text on a loop. 

say "Please provide the desired text of your standard input."; 
chomp($input = <STDIN>); # chomp removes a newline from the standard input. 
say "Please provide the amount of times that you want to print your standard input to the screen."; 
chomp($total = <STDIN>); 
say ">>> I'm in your loop! <<<"; 
do # A do while loop iterates at least once and up to the total number of iterations provided by user. 
{ 
say "Iteration $i of text: $input"; 
$i++; 
}while($i <= $total); 
say ">>> I'm out of your loop! <<<"; 

這是我所得到的,當我與「執行代碼你好「和」8「:標準輸入:

> perl .\stdin.pl 
Please provide the desired text of your standard input. 
Hello! 
Please provide the amount of times that you want to print your standard input to the screen. 
8 
>>> I'm in your loop! <<< 
Iteration 1 of text: Hello! 
Iteration 2 of text: Hello! 
Iteration 3 of text: Hello! 
Iteration 4 of text: Hello! 
Iteration 5 of text: Hello! 
Iteration 6 of text: Hello! 
Iteration 7 of text: Hello! 
Iteration 8 of text: Hello! 
>>> I'm out of your loop! <<< 
+0

這沒有解決我的問題 - 我沒有要求替代方案,我問爲什麼我寫的代碼不起作用。 – alex