【问题标题】:Bash array in perl scriptperl 脚本中的 Bash 数组
【发布时间】:2013-01-01 04:56:38
【问题描述】:

我有一个 bash 脚本,其中包含唯一的内容(一个数组),例如

bash_array.sh

locDbList=(default default_test)

我需要在 Perl 脚本中使用这个数组。

是否可以通过某种方式将 bash 文件中的数组定义加载到 Perl 中?

如果不是,那么我如何定义具有相同数组的 Perl 文件并将其加载到第二个 Perl 脚本中?

第二种情况:

perl_array.pl

second_perl_file.sh ( load the perl_array in here ). 

最后一个选项是将数组信息以我可以从 Perl 和 bash 中读取的格式放置,例如 ini 文件

【问题讨论】:

  • 我感觉你有一个XY Problem。为什么要两个 Perl 脚本?你真正想做什么?为什么不能在一个 Perl 脚本中编写所有代码?一个 Bash 脚本?
  • 我有一个 bash 脚本,它构建一个包并将用户参数放入一个 bash 文件中(以数组的形式)。稍后在包安装期间(基于 perl)。我想使用那些perl 中的值,谢谢
  • @JonathanLeffler 你有什么建议如何存储可以从 perl 和 bash 轻松访问的配置数据,谢谢
  • @sakhunzai,你能展示一些 bash 文件的示例内容吗?
  • @dan1111 bash 有一个数组:locDbList=(default default_test)

标签: perl bash ini


【解决方案1】:

你无法从%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} );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2013-07-19
    • 2013-07-13
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    相关资源
    最近更新 更多