2012-01-01 88 views
0

我在下面有这个perl代码,基本上想要循环这两个文件。然后调用一个bash脚本(它将文件和分隔符作为参数并打印出多行),然后将该命令的所有输出保存到一个新文件中(文件名末尾带有'_processed')。 下面的语法有什么问题(目前它只是创建一个空白文件)?perl - 将系统命令重定向到一个文件

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

my(@files) = (
"fixedtt.txt '|'", 
"delimd2iffpipe.dat '|'" 
); 
for my $i (0 .. $#files) { 
    my($filename) = split /[\s]+/, "$files[$i]", 2; 
    my($name, $type) = split /[\.]+/, "$filename", 2; 
    open (MYFILE, '>'."$name".'_processed.'."$type"); 
    system("sh myBashScript.sh $files[$i]"); #I want to write the entire output of this command to a file 
    close (MYFILE); 
} 
+0

为什么你是否打开并关闭MYFILE而不打印?你认为'system'语句正在写入该文件吗? – TLP 2012-01-01 14:41:58

回答

5

您可以通过在> <file name>之前重定向终端命令的输出。人机工程学:

system("sh myBashScript.sh $files[$i]"); 

变为:

system("sh myBashScript.sh $files[$i] > file.txt"); 
1

你似乎用Perl写如何文件混淆。您的openclose上的MYFILE句柄只会创建一个空文件。 system不对perl内的那个文件做任何事情。 (虽然我不能说你的sh脚本用它做什么)。

一些指针:

  • 您正在使用的@files,而不是元素, 降低可读性无缘无故的指标,因为指标本身 没有任何地方使用。
  • 您正在使用split来提取文件名和扩展名,并且我认为这是有原因的。但是,不需要将 LIMIT设置为2,因为您只使用该分组中的第一个或第二个 元素。
  • 如果您只有一个字符(或字符类别,例如\s),则不需要使用括号 。因此,请使用\s而不是[\s]
  • 建议使用带有 词法文件句柄的三参数open
  • 捕获输出(到标准输出)由backticks or qx()完成。 system只返回系统调用的返回值。 dunsmoreb 是正确的,你可以简单地在shell中重定向来创建 文件,但是这是在perl内部完成的。

如果我猜,我说你试图写bash脚本到您正试图打开该文件的输出,在这种情况下,你应该做的:

my @files = (
    "fixedtt.txt '|'", 
    "delimd2iffpipe.dat '|'" 
); 
for my $args (@files) { 
    my ($filename) = split ' ', $args; 
    $filename =~ s/\./_processed./; 
    open my $fh, '>', $filename or die $!; 
    print $fh qx(sh myBashScript.sh $args); 
    close $fh; 
} 
+0

+1感谢您解释它是如何工作的 – toop 2012-01-02 00:11:37

相关问题