2010-02-21 1 views
0

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

./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`; 
} 

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

+0

Какое сообщение об ошибке? – Paul

+0

Существует модуль, который может обрабатывать этот mkdir для вас. :) –

+1

Когда вы не знаете, почему команда не работает, распечатайте то, что вы пытаетесь запустить, чтобы убедиться, что это так, как вы думаете. –

ответ

4
# 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"; 
    } 
} 
+0

+1 для 'use strict;' и 'use warnings;' - что дало бы большую часть причин для отказа немедленно. Я не уверен в остальной части переписывания - это не было необходимо. –

+2

Это решение нарушает несколько правил безопасности. Вы никогда не должны брать внешние данные и передавать их непосредственно другому процессу. –

+1

'#!/Usr/bin/perl -T' для режима Taint. Смотрите: 'perldoc perlsec' – mctylr

3

для цикла имеет отсутствующий $

Массив OutputType является отсутствует в $itr для индекса

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

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