web-dev-qa-db-ja.com

変数をBashスクリプトからPerlスクリプトに移動するにはどうすればよいですか?

Bashスクリプトには、Perlに引き継ぐ必要がある変数があります。 bashスクリプトで変数$ galと$ obsidを宣言し、新しいプログラムを呼び出します。

gal=UCLA121
obsid=1896
./my_program

Perlスクリプトの先頭は、フレーズを含む画像をロードします

$ph_im =  "./$gal/img/${obsid}.img";

ただし、新しいプログラムでは変数はNULLです。

6
J. Doe

シェルスクリプトの子プロセスで変数を使用可能にするには、変数をエクスポートするか、

export foo=bar

または、変数を前に付けてプログラムを呼び出すことにより

foo=bar ./my_prog.pl

どちらの場合でも、Perlスクリプト内でそれらに対してENVを呼び出す必要があります

my $barfoo = $ENV{'foo'};
19

環境を使用すると、よりクリーンな方法になります。

-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
10
glenn jackman

あなたがそれを好きなら

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

ソース

これは古い例であるため、最新のスタイルを使用していない可能性があります。現在、Perlコンパイラーをセットアップしていないため、出力をテストできません。

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は、結果が混乱する場合にデバッグに役立つことを忘れないでください。

4
Brythan