将多个文件列表传递给 perl 脚本

Passing multiple file lists to perl script

我想将两个文件列表传递给我的 perl 脚本,并使用 Getopt::Long 处理它们以将数组(通过引用)存储在字典中。

#!/usr/bin/env perl

# author:sb2


use strict;
use warnings;
use Getopt::Long;
use File::Basename;
use Data::Dumper;


print Dumper(@ARGV);

my($config);

$config = &configure(scalar @ARGV);

sub configure{
    my $args = shift;
    my $config = {};
    my @current_samples = ();
    #my @old_samples = ();
    $config = {'current_samples' => \@current_samples};
    #$config = {'old_samples' => \@old_samples};
    GetOptions($config, 
           #"old_samples=s{,}",
           "current_samples=s{,}",
               "help|h!", )
        || warn "error : $!\n";
    print Dumper($config);
    return($config);
}

我可以愉快地传递一个文件列表并按预期存储它:

[sb2 ~]$ perl test.pl -current_samples WS*
$VAR1 = '-current_samples';
$VAR2 = 'WS68726_1401';
$VAR3 = 'WS68726_1402';
$VAR4 = 'WS68726_1500';
$VAR5 = 'WS68726_1501';
$VAR1 = {
          'current_samples' => [
                                 'WS68726_1401',
                                 'WS68726_1402',
                                 'WS68726_1500',
                                 'WS68726_1501'
                               ]
        };

但是,当我取消注释我的第二个列表参数并使用它时,我的 'current_samples' 变量现在是一个具有单个文件名的字符串。尽管 'old_samples' 变量已正确解析(如上):

[sb2 ~]$ perl test.pl -current_samples WS* -old_samples HG*
$VAR1 = '-current_samples';
$VAR2 = 'WS68726_1401';
$VAR3 = 'WS68726_1402';
$VAR4 = 'WS68726_1500';
$VAR5 = 'WS68726_1501';
$VAR6 = '-old_samples';
$VAR7 = 'HG001';
$VAR8 = 'HG002';
$VAR9 = 'HG003';
$VAR1 = {
          'current_samples' => 'WS68726_1501'
          'old_samples' => [
                             'HG001',
                             'HG002',
                             'HG003'
                           ]
        };

我尝试调换变量的顺序,唯一有所不同的是调换了配置赋值顺序:

sub configure{
    my $args = shift;
    my $config = {};
    my @current_samples = ();
    #my @old_samples = ();
    $config = {'current_samples' => \@current_samples};
    #$config = {'old_samples' => \@old_samples};
    GetOptions($config, 
           "current_samples=s{,}",
           "old_samples=s{,}",
               "help|h!", )
        || warn "error : $!\n";
    print Dumper($config);
    return($config);
}

生产:

[sb2 ~]$ perl test.pl -current_samples WS* -old_samples HG*
$VAR1 = '-current_samples';
$VAR2 = 'WS68726_1401';
$VAR3 = 'WS68726_1402';
$VAR4 = 'WS68726_1500';
$VAR5 = 'WS68726_1501';
$VAR6 = '-old_samples';
$VAR7 = 'HG001';
$VAR8 = 'HG002';
$VAR9 = 'HG003';
$VAR1 = {
          'current_samples' => [
                                 'WS68726_1401',
                                 'WS68726_1402',
                                 'WS68726_1500',
                                 'WS68726_1501'
                               ],
          'old_samples' => 'HG003'
        };

我在 GetOptions CPAN 页面中看不到任何暗示此排序影响的内容,因此将不胜感激任何帮助!

从您的注释代码看来,您正在用这些行覆盖 $config

$config = {'current_samples' => \@current_samples};
#$config = {'old_samples' => \@old_samples};

相反,在一行中完成所有配置分配:

my $config = {
  'current_samples' => \@current_samples,
  'old_samples' => \@old_samples,
};

或者您可以在单行中完成它们并分配给 hashref 的键:

my $config = {};
$config->{'current_samples'} = \@current_samples;
$config->{'old_samples'} = \@old_samples;

作为替代解决方案,Getopt::Declare 还具有支持将参数加载到数组引用中的语法:

use strict; 
use warnings; 

use Getopt::Declare;

my $args = Getopt::Declare->new(
   join( "\n",
      '[strict]',
      "-current-samples <files>... \t List of file names",
      "-old-samples     <files>... \t List of file names",
   )
) || exit(1);

每个标记后的 ... 告诉 Getopt::Declare 将参数收集到数组引用中。

那么你只需在命令行指定多个space分隔值:

perl test-getopt-declare.pl -current-samples a b c d e f -old-samples 1 2 3 4 5 6