perl - перенаправить системную команду в файл - PullRequest
0 голосов
/ 01 января 2012

У меня есть этот 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); 
}

Ответы [ 2 ]

5 голосов
/ 01 января 2012

Вы можете перенаправить вывод команды терминала, поставив перед ней > <file name>. Ergo:

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

становится:

system("sh myBashScript.sh $files[$i] > file.txt");
1 голос
/ 01 января 2012

Вы, похоже, запутались в том, как perl пишет в файлы. Ваши open и close на дескрипторе MYFILE будут создавать только пустой файл. system ничего не делает с этим файлом в perl. (Хотя я не могу сказать, что с этим делает ваш sh-скрипт).

Некоторые указатели:

  • Вы используете индексы @files вместо элементов, которые снижает читабельность без причины, так как сами индексы нигде не используется.
  • Вы используете split для извлечения имени и расширения файла, а я Предположим, есть причина для этого. Тем не менее, нет необходимости устанавливать Ограничить до 2, так как вы используете только один или два элементы из этого раскола.
  • Если у вас есть только один символ (или класс символов, например \s), скобки не нужны. Итак, используйте \s вместо [\s].
  • Рекомендуется использовать трех аргумент open с лексическая файловая ручка.
  • Захват вывода (в стандартный вывод) выполняется с помощью обратных знаков или qx () . system возвращает только возвращаемое значение системного вызова. dunsmoreb правильно, что вы можете просто перенаправить в оболочке, чтобы создать файл, но это то, как это делается внутри 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; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...