%ENV
perlで実行している場合は、イベントからそれを確認することはできませんdeclare -a
。それでも、すぐ外側のスコープで定義されている配列はプルされません。
あなたはこれのために両端を働かなければならないかもしれません。そして、それはそれほど簡単ではありませんが、ここから始めましょう。
Perlへの受け渡し
まず、この値を渡す準備をするためにbash関数を作成しました。
function pass_array
{
# get the array name
declare array_name=$1;
# get all declarations for defined arrays.
# capture the line that corresponds with the array name
declare declaration=$(declare -a | grep --perl-regex --ignore-case "\\b$array_name\\b");
# - At this point this should look like:
# declare -a* array_name='([0]="value1", [1]="value2", [2]="value3")'
# - Next, we strip away everything until the '=', leaving:
# '([0]="value1", [1]="value2", [2]="value3")'
echo ${declaration#*=};
}
あなたはそれを次のようにperlに渡すことができます:
perl -Mstrict -Mwarnings -M5.014 -MData::Dumper -e 'say Data::Dumper->Dump( [ \@ARGV ], [ q[*ARGV] ] )' "$(pass_array locDbList)"
Perl側では、次のような便利な関数があるかもしれません。
sub array_from_bash {
return shift =~ m/\[\d+\]="([^"]*)"/g;
}
名前付き配列
もちろん、配列の名前を保持して、複数を渡すことができるようにしたり、他の環境変数を使用して動的に配置したりすることもできます。(export DB_LIST_NAME=locDBList
)
pass_array
その場合、 bash関数がエコーするものを変更したい場合があります。
echo echo ${declaration#*-a[b-z]* };
そして、次のようなPerl関数が必要になる場合があります。
sub named_array_from_bash {
return unless my $array_name = ( shift // $_ );
my $arr_ref = [ @_ ? @_ : @ARGV ];
return unless @$arr_ref
or my ( $array_decl ) =
grep { index( $_, "$array_name='(" ) == 0 } @$arr_ref
;
return array_from_bash( substr( $array_decl, length( $array_name ) + 1 ));
}
環境変数
しかし、別のアイデアは、同じ情報を持つ変数を単純にエクスポートすることです。
declare decl=$(declare -a | grep --perl-regex --ignore-case "\\b$array_name\\b");
export PERL_FROM_BASH_LIST1=${decl#*-a[a-z]* };
そしてそれをPerlから読んでください。
my @array = array_from_bash( $ENV{PERL_FROM_BASH_LIST1} );