【问题标题】:Using optional arguments from command line within the system function in perl在 perl 的系统函数中使用命令行中的可选参数
【发布时间】:2014-06-24 16:06:12
【问题描述】:

我正在概括一个预先存在的 perl 脚本......即让它同时在多个实例上工作。基本上它是建模脚本的参数扫描功能。扫描只执行一个参数,我希望它全部完成。预先存在的脚本(如果您感兴趣,从 bionetgen 称为 scan_var.pl)有一堆参数 - 其中一些是可选的。

以下以默认设置成功实现参数扫描

#execute the parameter scan with each variable individually

foreach $var_name (@var_names){

    my $param = shift @var_names;
    system ("perl", $scan_var_location, $model, $param, $min_value, $max_value, $NPTS);
}

但现在我想使用GetOpt::Long 模块来解析可选参数。到目前为止,我的代码是:

# some default parameters
my $log     = 0;
my $t_end   = 20;
my $n_steps = 1;
my $steady_state = 0;
my $method = "\"ode\"";
my $verbose = 0;
my $prefix;

my $options = GetOptions ( 
                           'verbose'      => \$verbose, #boolean
                           'log'          => \$log, #boolean
                           'n_steps:i'    => \$n_steps, #integer
                           'steady_state' => \$steady_state, #boolean
                           'method:s'     => \$method, #string
                           't_end:i'      => \$t_end, #integer
                           'prefix:s'     => \$prefix string
                         );

#execute the parameter scan with each variable individually

foreach $var_name (@var_names){ #iterates through a list stored in $var_names(not shown for concise-ness)

    my $param = shift @var_names;

    system ("perl", $scan_var_location, #required value, directory
                    $options, #optional command line arguments - corresponds to the list above
                    $model, #required command line value (directory)
                    $param, #list iterated over
                    $min_value, #requierd integer
                    $max_value, #required integer
                    $NPTS #required integer
           );
}

然而,这在某种程度上是不正确的。有人有更正的建议吗?

干杯

【问题讨论】:

  • 总是 use strict; use warnings;!请更详细地描述您的问题。
  • 如果您将GetOptions 的每个参数对放在单独的行上,您的代码将更具可读性并且更易于调试。就目前而言,您有 'n_steps:i' => \ \$n_steps, 并且额外的反斜杠是多余的。
  • Biffen - 使用严格和警告已打开,这只是我脚本的底部,因为要求人们阅读它太长了,(但无论如何感谢您的建议)。至于更多细节 - 我已经尝试过这样做,所以如果我使用可选参数,我的新脚本将在系统函数中自动使用它们。我想问题是有些是布尔值,而有些是数值。

标签: perl command-line system


【解决方案1】:

GetOptions() 支持在散列中存储值。这可以让您减少变量混乱:

use Getopt::Long;

my %options;
GetOptions( \%options,
                       'verbose',
                           'log',
                     'n_steps:i',
                  'steady_state',
                      'method:s',
                       't_end:i',
                      'prefix:s',
          );

my $stringified_options = join ' ', map "-$_ $options{$_}", keys %options;

foreach my $var_name ( @var_name ) {

    system ("perl", $scan_var_location,
                    $stringified_options,
                    $model,
                    $param, 
                    $min_value,
                    $max_value,
                    $NPTS
           );
}

【讨论】:

    【解决方案2】:

    一个问题是您可能不想在您的system 调用中使用GetOptions返回值$options 有返回值:

    GetOptions 返回 true 表示成功。它返回 false 时 函数在选项解析期间检测到一个或多个错误。

    【讨论】:

      【解决方案3】:

      以下是您的代码的更严格版本:

      GetOptions ( 
          'verbose'      => \(my $verbose = 0),        #boolean
          'log'          => \(my $log     = 0),        #boolean
          'n_steps:i'    => \(my $n_steps = 1),        #integer
          'steady_state' => \(my $steady_state = 0),   #boolean
          'method:s'     => \(my $method = q{"ode"}),  #string
          't_end:i'      => \(my $t_end   = 20),       #integer
          'prefix:s'     => \my $prefix,               #string
      );
      
      #execute the parameter scan with each variable individually
      
      #iterates through a list stored in $var_names(not shown for concise-ness)
      foreach $var_name (@var_names) { 
          system("perl", 
              $scan_var_location,   #required value, directory
              $model,               #required command line value (directory)
              $var_name,            #list iterated over
              $min_value,           #requierd integer
              $max_value,           #required integer
              $NPTS,                #required integer
          );
      }
      

      【讨论】:

      • 谢谢-有道理...我在徘徊,在这种情况下括号前的反斜杠是什么?我使用它们只是因为我在其他示例中看到了它是如何完成的,但我不明白为什么。不能是转义字符吧?
      • 反斜杠是将标量的引用传递给GetOptions。这就是GetOptions 函数用来在词法变量中设置值的机制。
      猜你喜欢
      • 2013-04-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2023-04-01
      • 2021-11-24
      • 2013-12-28
      相关资源
      最近更新 更多