0

唯一のコンテンツ(配列)を含むbashスクリプトがあります。例:

bash_arrray.sh

locDbList=(default default_test)

この配列をPerlスクリプトで使用する必要があります。

配列定義をbashファイルからPerlに何らかの方法でロードすることは可能ですか?

そうでない場合は、同じ配列でPerlファイルを定義し、それを2番目のPerlスクリプトにロードするにはどうすればよいですか?

2番目の場合:

perl_arrray.pl

second_perl_file.sh ( load the perl_array in here ). 

最後のオプションは、配列情報をPerlとbashの両方から読み取れる形式(iniファイルなど)に配置することです。

4

1 に答える 1

1

%ENVperlで実行している場合は、イベントからそれを確認することはできません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} );
于 2013-01-17T18:18:24.817 に答える