2013-11-02 202 views
0

我想讀取從STDIN輸入的html文件執行某些功能,然後將另一個html文件寫入STDOUT。我的問題是我必須以規定的方式提交文件。我嘗試過很多東西,但沒有什麼效果。沒有什麼是越來越印刷從STDIN讀取文件並寫入STDOUT

我的命令行提示符

perl universe.pl<sun.html>galaxy.html 

我的代碼 -

open(my $in, "<&STDIN")  or die "Can't dup STDIN: $!"; 
open(my $out, ">&STDOUT")  or die "Can't dup STDOUT: $!"; 

my @lines = <$in>; 
foreach(@lines) { 
    push(@newlines,$_); 
    say "Lines pushing:", $_; 
} 
+0

向我們展示您的嘗試 –

+0

您幾乎不得不努力嘗試失敗;從標準輸入讀取非常簡單,寫入標準輸出非常簡單。所以,正如保羅所說,你需要表明你在嘗試什麼,因爲你一定是過度思考。提示:單詞STDIN和STDOUT不會出現在腳本中。 –

回答

1

使用魔法鑽石操作<>,你將能夠做到你的要求。但請下次再提供一些搜索工作。

use strict; use warnings; 

while (my $line = <>) { 
    # do something with $line 
} 

最後但並非最不重要;如果你必須解析HTML的好方法,看看HTML::TreeBuilder::XPath或只是HTML::TreeBuilder

+0

請注意,在將代碼添加到問題之前提供了此答案。 –

+0

這是好的,如果我只給一個輸入文件 像 - perl universe.pl kay

+0

@ user2907995:您只能給一個輸入文件使用不允許更改的命令符號。 –

2

你不需要打開STDIN或STDOUT;他們隨時準備開放。

你不需要整個文件啜到內存如同你:

my @lines = <$in>; 

你從來不會使用$out這應該是表明一個問題。

while (<>) 
{ 
    print mapping_func($_); 
} 

其中mapping_func()是你的函數,它在它的輸入字符串相關的轉換,並返回映射結果:

sub mapping_func 
{ 
    my($string) = @_; 
    $string =~ s/html/HTML/gi; 
    return $string; 
} 
+0

這是沒有幫助 – kay

+2

@ user2907995:爲什麼不呢?我沒有解決你的問題的哪一部分?它根據需要從標準輸入中讀取;它根據需要寫入標準輸出;它調用一個函數來處理讀取的行,這就是你說的你需要做的。你的一些評論問到如何處理多個文件;如果以'perl universe.pl file1.html file2.html file3.html> output.html'的形式調用此代碼,則將所有輸出寫入單個文件。如果您想覆蓋原始文件,那麼'perl -i.bak universe.pl file1.html file2.html file3.html'將會執行每個文件。 –

0

我有這個問題,這是從裏面另一個Perl腳本運行的腳本。

解決方案是設置$ |在第二個腳本中(執行從STDIN讀取的腳本的腳本)。

相關問題