簡體   English   中英

perl-將系統命令重定向到文件

[英]perl - redirect system command to a file

我下面有這個perl代碼,基本上想遍歷這2個文件。 然后調用bash腳本(它將文件和分隔符作為參數,並打印出多行),然后將該命令的所有輸出保存到新文件中(文件名的末尾加上“ _processed”)。 以下語法有什么問題(目前它僅創建一個空白文件)?

#!/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); 
}

您可以在終端命令的輸出之前加上> <file name>來重定向輸出。 Ergo:

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

成為:

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

您似乎對perl如何寫入文件感到困惑。 您在MYFILE句柄上的openclose將僅創建一個空文件。 system在perl中不對該文件執行任何操作。 (盡管我不能說出您的sh腳本是如何處理的)。

一些指針:

  • 您正在使用@files的索引而不是元素,這會無緣無故地降低可讀性,因為索引本身並未在任何地方使用。
  • 您正在使用split提取文件名和擴展名,我認為這是有原因的。 但是,由於您僅使用該拆分中的前一個或兩個元素,因此無需將LIMIT設置為2。
  • 如果只有一個字符(或字符類,例如\\s ),則不需要括號。 因此,使用\\s代替[\\s]
  • 建議使用帶有詞法文件句柄的三參數open
  • 使用反引號或qx()捕獲輸出(到stdout 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; 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM