将多个文件列表传递给 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
我想将两个文件列表传递给我的 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