2012-01-01 50 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

相關問題