Como posso passar argumentos de linha de comando para um programa Perl?

137

Estou trabalhando em um script Perl. Como posso passar parâmetros de linha de comando para ele?

Exemplo:

script.pl "string1" "string2"
lamcro
fonte
3
Bem, primeiro, você precisará que isso ./script.placonteça ou muita coisa não vai acontecer no tempo de execução.
Parthian Shot

Respostas:

189

Depende do que você quer fazer. Se você deseja usar os dois argumentos como arquivos de entrada, basta passá-los e usá-los <>para ler seu conteúdo.

Se eles tiverem um significado diferente, você poderá usar GetOpt::Stde GetOpt::Longprocessá-los facilmente. GetOpt::Stdsuporta apenas comutadores de caractere único e GetOpt::Longé muito mais flexível. De GetOpt::Long:

use Getopt::Long;
my $data   = "file.dat";
my $length = 24;
my $verbose;
$result = GetOptions ("length=i" => \$length,    # numeric
                    "file=s"   => \$data,      # string
                    "verbose"  => \$verbose);  # flag

Como alternativa, @ARGVé uma variável especial que contém todos os argumentos da linha de comandos. $ARGV[0]é o primeiro (ou seja, "string1"no seu caso) e $ARGV[1]é o segundo argumento. Você não precisa de um módulo especial para acessar @ARGV.

user44511
fonte
29
$ ARGV [0] é o primeiro argumento; o perl conta de 0 e o nome do programa está em $ 0 e não @ARGV.
Derobert 12/12/08
4
apesar da confusão de $ ARGV [0] .. este é o tipo de resposta que espero encontrar, ao pesquisar SO, obrigado e +1 de mim.
Lexu
60

Você as passa exatamente como está pensando e, no seu script, as obtém da matriz @ARGV. Igual a:

my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";

foreach my $argnum (0 .. $#ARGV) {

   print "$ARGV[$argnum]\n";

}

A partir daqui .

George Stocker
fonte
8
Também vale a pena notar que, em algumas linguagens de programação, o primeiro (0) argumento é o comando ou o próprio script ... embora não seja em perl, é claro.
Danieltalsky 12/12/08
10
Em vez de $#ARGV + 1você também poderia ter dito@ARGV
Leon Timmermans
1
basta usar ARGV[0]ou $argv[1]se você estiver procurando por um argumento específico.
Manoj 25/11
29
foreach my $arg (@ARGV) {
    print $arg, "\n";
}

irá imprimir cada argumento.

nrich
fonte
Se não estiver usando getopts, é assim que eu recomendaria atravessar não destrutivamente uma lista de argumentos. Baseado em perlmeme.org/howtos/syntax/foreach.html , parece que a sintaxe está correta; para uma ressalva, verifique a seção, efeitos colaterais: A variável de controle é um alias para o elemento da lista
jaredor
24

Como alternativa, uma maneira perlish mais sexy ...

my ($src, $dest) = @ARGV;

"Assume" dois valores são passados. Código extra pode verificar que a suposição é segura.

rastin71
fonte
6
Não tenho certeza de como essas informações são novas, mas decidi contra um voto negativo, já que você é novo.
Joel Berger
Não é mais sexy. Todos os argumentos estão disponíveis através @ARGVsem qualquer ação de você apenas como C / C ++ fornecê-los através argv / argc
Eugen Konkov
21

Ainda outra opção é usar perl -s, por exemplo:

#!/usr/bin/perl -s

print "value of -x: $x\n";
print "value of -name: $name\n";

Então chame assim:

% ./myprog -x -name=Jeff
value of -x: 1
value of -name: Jeff

Ou consulte o artigo original para obter mais detalhes:

João Costa
fonte
13

Você pode acessá-los diretamente, atribuindo a variável especial @ARGVa uma lista de variáveis. Então, por exemplo:

( $st, $prod, $ar, $file, $chart, $e, $max, $flag ,$id) = @ARGV;

perl tmp.pl 1 2 3 4 5

insira a descrição da imagem aqui

pkm
fonte
7

Se os argumentos forem nomes de arquivos para leitura, use o operador diamond (<>) para obter seu conteúdo:

while (my $line = <>) {
  process_line($line);
}

Se os argumentos forem opções / opções, use GetOpt :: Std ou GetOpt :: Long, como já mostrado por slavy13.myopenid.com.

Com a chance de serem algo mais, você pode acessá-los através do @ARGV explicitamente ou com o shiftcomando:

while (my $arg = shift) {
  print "Found argument $arg\n";
}

(Observe que fazer isso com shiftsó funcionará se você estiver fora de todos os subs. Em a sub, ele recuperará a lista de argumentos passados ​​para o sube não dos passados ​​para o programa.)

Dave Sherohman
fonte
5
my $output_file;

if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))

{

$output_file= chomp($ARGV[1]) ;


}
user3331697
fonte
2

Se você quiser apenas alguns valores, basta usar a matriz @ARGV. Mas se você está procurando algo mais poderoso para fazer o processamento de algumas opções de linha de comando, use Getopt :: Long .

Marc
fonte