2013-11-02 160 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读取的脚本的脚本)。

相关问题