Как я могу передать аргументы внешнему процессу из Perl?

StackOverflow https://stackoverflow.com/questions/2306388

Вопрос

У меня есть исполняемое приложение, которое запускается с разными параметрами для получения разных выходных данных.Я хочу задать некоторые параметры для этого из параметров командной строки скрипта, а другие будут локальными для скрипта.Использование:

./dump-output.pl <version> <folder-name> <output-file>


my $version = $ARGV[0];
my $foldername = $ARGV[1];
my $outputfile = $ARGV[2];
my $mkdir_cmd = "mkdir -p ~/$foldername";

# There are 6 types of outputs, which can be created:
# 'a', 'b', 'c', 'd', 'e' or 'f'
my @outputtype = ('a', 'b', 'c', 'd', 'e', 'f');

my $mkdir_out = `$mkdir_cmd`;

for( $itr=0; itr<=5; itr++ ) {
    $my_cmd = "./my_app -v $version -t $outputtype[itr] -f $outputfile > ~/$foldername/$outputtype.out"
    $my_out = `$my_cmd`;
}

Я делаю что-то изначально неправильное с приведенным выше кодом, но не смог разобраться в этом:-(

Это было полезно?

Решение

# Always include these at the top of your programs.
# It will help you find bugs like the ones you had.
use strict;
use warnings;

# You can get all arguments in one shot.
my ($version, $foldername, $outputfile) = @ARGV;

# A flag so we can test our script. When
# everything looks good, set it to 1.
my $RUN = 0;

my $mkdir_cmd = "mkdir -p ~/$foldername";
my $mkdir_out = run_it($mkdir_cmd);

# Word quoting with qw().
my @outputtype = qw(a b c d e f);

# If you already have a list, just iterate over it --
# no need to manually manage the array subscripts yourself.
for my $type (@outputtype) {
    my $my_cmd = "./my_app -v $version -t $type -f $outputfile > ~/$foldername/$type.out";
    my $my_out = run_it($my_cmd);
}

# Our function that will either run or simply print
# calls to system commands.
sub run_it {
    my $cmd = shift;
    if ($RUN){
        my $output = `$cmd`;
        return $output;
    }
    else {
        print $cmd, "\n";
    }
}

Другие советы

В цикле for отсутствует $

В массиве outputtype отсутствует $itr для индекса

Там может быть что-то еще - я не проверял.Это очевидный материал.

Похоже, возможно, вы пришли с такого языка, как C, где переменной может быть простое слово типа "i".Переменные в perl всегда начинаются с $ для скалярного, @ для списка, % для хэша.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top