2014-01-24 54 views
0

我是Perl新手,所以這可能是一個非常基本的案例,我仍然無法理解。如何將結果STDOUT打印到Perl中相同目錄中的臨時空白新文件?

案例:
程序告訴用戶輸入文件名。
用戶輸入文件名(1個或多個文件)。
程序讀取文件輸入的內容。
如果是單個文件輸入,那麼它只是打印它的全部內容。
如果它是多文件輸入,則它會按順序組合每個文件的內容。
然後將結果打印到臨時的新文件,該文件與program.pl位於同一目錄中。

FILE1.TXT:

一個
b

FILE2.TXT:

Ç
d
Ë
˚F

單輸入程序ioSingle.pl:

#!/usr/bin/perl 

print "File name: "; 
$userinput = <STDIN>; chomp ($userinput); 

#read content from input file 
open ("FILEINPUT", $userinput) or die ("can't open file"); 


#PRINT CONTENT selama ada di file tsb 
while (<FILEINPUT>) { 
print ; } 

close FILEINPUT; 

單個結果在cmd中:

> perl的ioSingle.pl
文件名:FILE1.TXT

一個
b
end

我發現,從multifiles輸入相結合的內容,但無法適應而上述論點編寫教程代碼:

while ($userinput = <>) { 
     print ($userinput); 
} 

我在使它成爲multifiles輸入工作stucked,
我怎麼想重新設置代碼所以我的程序可以給這樣的結果?

預期MULTIFILES導致CMD:

> perl的ioMulti.pl
文件名:FILE1.TXT文件2。TXT 頭
一個
b


Ç
d
Ë
˚F

感謝您的響應:)

回答

2

開始處理類似問題的一個好方法是將其分解爲更小的部分。

你的問題似乎打破這樣的:

  • 得到的文件名列表
  • 列表中的每個文件
    • 顯示文件內容

所以想想編寫完成這些任務的子例程。你已經有了一些子程序來顯示文件的內容。

sub display_file_contents { 
    # filename is the first (and only argument) to the sub 
    my $filename = shift; 

    # Use lexical filehandl and three-arg open 
    open my $filehandle, '<', $filename or die $!; 

    # Shorter version of your code 
    print while <$filehandle>; 
} 

下一個任務是獲取我們的文件列表。你也有一些。

sub get_list_of_files { 
    print 'File name(s): '; 
    my $files = <STDIN>; 
    chomp $files; 

    # We might have more than one filename. Need to split input. 
    # Assume filenames are separated by whitespace 
    # (Might need to revisit that assumption - filenames can contain spaces!) 
    my @filenames = split /\s+/, $files; 

    return @filenames; 
} 

然後我們可以把所有這些放在主程序中。

#!/usr/bin/perl 

use strict; 
use warnings; 

my @list_of_files = get_list_of_files(); 
foreach my $file (@list_of_files) { 
    display_file_contents($file); 
} 

通過將任務分解爲更小的任務,每個任務變得更容易處理。而且你不需要一次把頭腦中的整個程序的複雜性都帶進去。

p.s.但就像JRFerguson所說的那樣,將文件列表作爲命令行參數會使這變得更簡單。

+0

我已經通過上面的代碼管理它。 起初,它給了我行錯誤警告'print while while $ $ filehandle;'。所以我把它重新編輯爲'print while(<$filehandle>);'然後結果最終如預期般出來。 你能告訴我,那真的很重要嗎? – ask91

+0

這是一個錯字。我現在修好了。 –

+0

但這裏重要的是不要只是剪切和粘貼我的解決方案。但要理解我勾勒出的設計流程,以便將來可以採用類似的流程。 –

2

簡單的方法是使用鑽石操作員<>打開並讀取命令行上指定的文件。這將實現你的目標:

while (<>) { 
    chomp; 
    print "$_\n"; 
} 

這樣:ioSingle.pl file1.txt file2.txt

如果這是唯一的目的,你可以使用-p-n開關這樣減少到命令行腳本:

perl -pe '1' file1.txt file2.txt 

perl -ne 'print' file1.txt file2.txt 

這些開關圍繞-e命令創建隱式循環。該-p開關打印$_的每一個循環之後,如果你寫了:

LINE: 
while (<>) { 
    # your code... 
} continue { 
    print; 
} 

使用-n創建:

LINE: 
while (<>) { 
# your code... 
} 

因此,-p添加一個隱式打印語句。

+0

感謝您的響應, 和是,這樣的代碼: '而($ userinput = <>){ 打印($ userinput); }' 當執行> perl program.pl file1.txt file2.txt tht將簡單地給出結果多文件輸入的組合內容。 @Dave Cross說明如何首先從提示文本中讀取輸入 – ask91

相關問題