2014-06-24 1 views
0

저는 기존의 perl 스크립트를 일반화하고 있습니다. 즉, 동시에 많은 인스턴스에서 작동하게합니다. 기본적으로 이것은 모델링 스크립트의 매개 변수 스캔 기능입니다. 스캔은 단일 매개 변수를 수행하며 모두 수행해야합니다. 이미 존재하는 스크립트 (관심이 있다면 bionetgen에서 scan_var.pl이라고 함)는 인수가 많습니다. 그 중 일부는 선택 사항입니다.perl에서 시스템 함수 내에서 명령 행의 선택적 인수를 사용합니다.

다음은 매개 변수는 기본 설정

#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 
      ); 
} 

이것은 다소 잘못되었습니다. 아무도 수정에 대한 제안이 있습니까?

건배

+1

* 항상 *'엄격한 사용; 경고를 사용하라. 문제를 자세히 설명해주십시오. – Biffen

+1

'GetOptions'에 대한 각 매개 변수 쌍을 별도의 줄에 넣으면 코드를 훨씬 쉽게 읽고 디버깅 할 수 있습니다. 그것으로 당신은''n_steps : i '=> \ \ $ n_steps' '를 가지며 추가 백 슬래쉬는 불필요합니다. – Borodin

+0

'$ options'의 내용을 어떻게 하시겠습니까? – toolic

답변

0

하나의 문제는 아마 당신의 system 호출에서 반환 값을 GetOptions을 사용하지 않는다는 것입니다. $options의 반환 값은 다음과 같습니다.

GetOptions은 성공을 나타내려면 true를 반환합니다. 함수가 옵션 구문 분석 중 하나 이상의 오류를 감지하면 false를 반환합니다.

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 
      ); 
} 
0

다음은 코드의 엄격한 버전입니다 : 이것은 당신이 변수 혼란을 줄일 수 있습니다

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 
    ); 
} 
+0

고마워요. 의미가 있습니다. 방황하고 있었는데,이 문맥에서 대괄호 앞에 백 슬래시가 무엇입니까? 다른 예제에서 어떻게 수행되었는지 보았으므로 그 이유를 이해하지 못했습니다. 이스케이프 문자가 될 수 없습니다. – CiaranWelsh

+0

백 슬래시는 스칼라에 대한 참조를'GetOptions'에 전달하는 것입니다. 이것이'GetOptions' 함수가 어휘 변수에 값을 설정하는 데 사용하는 메커니즘입니다. – Miller

관련 문제