J'ai des variables dans un script bash qui doivent être transférées dans un script Perl. J'ai les variables $ gal et $ obsid déclarées dans le script bash, puis j'appelle le nouveau programme.
gal=UCLA121
obsid=1896
./my_program
Le début du script Perl charge une image avec la phrase
$ph_im = "./$gal/img/${obsid}.img";
Mais les variables sont NULL dans le nouveau programme.
Rendre les variables disponibles pour le processus enfant dans un script Shell peut être fait soit en exportant des variables
export foo=bar
Ou en appelant programme avec des variables pré-ajoutées
foo=bar ./my_prog.pl
Dans les deux cas, vous devrez appeler ENV
dans le script Perl.
my $barfoo = $ENV{'foo'};
Utiliser l'environnement est une manière plus propre.
Il y a le commutateur -s
:
$ cat vars.pl
#!Perl
use feature 'say';
say "foo=$foo";
say "bar=$bar";
$ echo "$foo,$bar"
123,456
$ Perl -s ./vars.pl -foo="$foo" -bar="$bar"
foo=123
bar=456
Si vous l'appelez comme
./myscript.pl 1 35
Vous pouvez utiliser @ARGV
. Par exemple.
#!/usr/bin/Perl
use strict;
use warnings;
use Data::Dumper qw(Dumper);
print "ARGV[0]=$ARGV[0]";
print "ARGV[1]=$ARGV[1]";
print Dumper \@ARGV;
Exemple source .
Ceci est un ancien exemple, de sorte qu'il n'utilise peut-être pas le dernier style. Je n'ai pas de compilateur Perl configuré pour le moment, je ne peux donc pas tester la sortie.
Vous pouvez utiliser le Data::Dumper
pour vous aider à déboguer des choses.
Si vous l'appelez comme
Perl -s ./myprogram -$gal="$gal" -$obsid="$obsid" 1 35
Réalisez que vous pourriez obtenir des résultats étranges en mélangeant @ARGV
et des paramètres nommés. Vous voudrez peut-être changer la façon dont vous l'appelez en quelque chose comme
Perl -s ./myprogram $gal $obsid 1 35
ou
Perl -s ./myprogram -gal="$gal" -obsid="$obsid" -first="1" -second="35"
Notez également que les paramètres nommés sont -gal
, pas -$gal
. Je ne suis pas tout à fait sûr de ce que le $
ferait là-bas, mais il aurait tendance à faire autre chose que ce qui se passe sans lui.
Rappelez-vous, Data::Dumper
peut vous aider à déboguer des choses si vous obtenez des résultats confus.