У меня есть переменные в bash-скрипте, которые мне нужно перенести в perl-скрипт. У меня есть переменные $ gal и $ obsid, объявленные в скрипте bash, а затем я вызываю новую программу.
gal=UCLA121
obsid=1896
./my_program
В начале сценария Perl загружается изображение с фразой
$ph_im = "./$gal/img/${obsid}.img";
Но переменные равны NULL в новой программе.
Сделать переменные доступными для дочернего процесса в сценарии оболочки можно либо путем экспорта переменных
export foo=bar
, либо путем вызова программы с добавленными переменными
foo=bar ./my_prog.pl
В любом случае вам понадобится вызвать ENV
на них внутри сценария perl
my $barfoo = $ENV{'foo'};
Использование окружающей среды является более чистым способом.
Имеется переключатель -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
Если Вы называете его как
./myscript.pl 1 35
Можно использовать @ARGV
. Например.
#!/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;
Источник в качестве примера.
Это - старый пример, таким образом, он не может использовать последний стиль. Мне не настраивали компилятор жемчуга в данный момент, таким образом, я не могу протестировать вывод.
Можно использовать Data::Dumper
помочь Вам отладить вещи.
Если Вы называете его как
perl -s ./myprogram -$gal="$gal" -$obsid="$obsid" 1 35
Поймите, что можно стать странными смешивание результатов @ARGV
и названные параметры. Вы могли бы хотеть измениться, как Вы называете его к чему-то как
perl -s ./myprogram $gal $obsid 1 35
или
perl -s ./myprogram -gal="$gal" -obsid="$obsid" -first="1" -second="35"
Обратите внимание также, что именованные параметры -gal
, нет -$gal
. Я не совсем уверен что $
сделал бы там, но это будет иметь тенденцию делать что-то другое, чем, что происходит без него.
Помните, Data::Dumper
может помочь Вам отладить вещи, если Вы получаете запутывающие результаты.