2010-01-05 8 views
0

필자는 구성 파일을 읽고 CGI 스크립트를 작성하기 위해 Perl 스크립트를 작성했습니다. 이것은 잘 작동하고 터미널에서 CGI 스크립트의 출력을 얻었고 웹 페이지에서 CGI 스크립트를 실행할 수 있습니다. 아래는 나의 샘플 스크립트이다.새 CGI 스크립트를 프로그래밍 방식으로 만들고 즉시 실행할 수 있습니까?

#!/usr/bin/perl -w 

use strict; 
use Text::Template; 

my $conf = "test.cfg"; 

open CFG, $conf or die "Could not open config file"; 
my @rawConfig = <CFG>; 
my $config = eval "{".join("",@rawConfig)."}"; 

my $template = Text::Template->new(TYPE => 'FILE', SOURCE => 'test.cgi.tmpl'); 
my $result = $template->fill_in(HASH => $config); 
print $result; 

이것을 사용하여 각 CGI를 저장하고 별도로 실행해야합니다. 이 코드를 수정하여 웹에서이 스크립트를 직접 실행하고 웹 페이지에 출력을 표시 할 수 있도록 도움이 필요합니다.

답변

2

여러 템플릿 기반 스크립트는 (거의) 올바른 대답이 아닙니다.

구성 파일의 데이터 구조를 사용하고 구조를 제어하여 필요한 동작을 얻습니다.

대신 코드를 생성하기 위해 템플릿을 사용하는 것처럼 : 생성하여 (즉, '당신의 기능을 카레'입니다)

# Get this from a config file. YAML perhaps 
my $cfg = { 
    foo => [ \&blarg, \&feemb ], 
    bar => [ \&crag, \&forg ], 
    baz => [ \&chomb, \&veezle ], 
}; 

sub calculate_product { 
    my $cfg = shift; 
    my $type = shift; 
    my $thing = shift; 

    my @subs_to_call = @{ $cfg->{$type} || [] }; 

    my $result = {shift @subs_to_call}->($thing}; 

    $result *= $_->($thing) for @subs_to_call; 

    return $result; 
} 
# Call like so: 
my $foo_prod = calculate_product($cfg, 'foo', 15); 

당신은 서브 루틴에 설정 정보를 결합 할 수 있습니다

sub foo { 
    my $thing = shift; 

    return blarg($thing) * feemb($thing); 
} 

sub bar { 
    my $thing = shift; 

    return crag($thing) * forg($thing); 
} 

sub baz { 
    my $thing = shift; 

    return chomb($thing) * veezle($thing); 
} 

은이 작업을 수행 구성 정보로 폐쇄 :

# Get this from a config file. YAML perhaps 
my $cfg = { 
    foo => [ \&blarg, \&feemb ], 
    bar => [ \&crag, \&forg ], 
    baz => [ \&chomb, \&veezle ], 
}; 

my %calculate_product; 
for my $product (keys %$cfg) { 

    my @stored_subs_to_call = @{$cfg->{$product} || [] }; 

    $calculate_product{$prod} = sub { 
     my $thing = shift; 

     my @subs_to_call = @stored_subs_to_call; 

     my $result = {shift @subs_to_call}->($thing}; 

     $result *= $_->($thing) for @subs_to_call; 

     return $result; 
    } 
} 

# Call generated code like so: 
my $foo_prod = $calculate_product{foo}->(15); 
6

이것은 매우 무서운 일이며, 일반적으로 새로운 프로그램을 만드는 일을 반대하고 전 세계가 어딘가에서 인간없이 그들을 실행할 수 있도록 조언합니다.

그러나 내가 만드는 CGI 스크립트가 다른 구성 데이터 만 필요로하고 스크립트 자체에 그 권한을 저장했기 때문에이 작업을 수행 한 것으로 의심됩니다. 그것은 단지 추측이지만이 종류의 일에 대한 일반적인 동기 부여 자입니다. 대답은 구성 데이터를 스크립트에 저장하지 않는 것입니다. 코드에 구성을 저장하지 않을 것에 대한 전체 장이 Mastering Perl입니다.

설명하는 상황을 피하기 위해 열심히 노력하고 싶습니다.

(Does SO have a spoiler tag?)

당신이 정말 좋은 이유에 대해이 작업을 수행하는 데 필요한 (그리고 그 거의 절대 경우는 없다) 경우, 그런 다음에 내부 리디렉션을 발급 원래의 과정에서 파일을 만들 것 새로운 CGI 스크립트. 그 총알을 총에 넣지 않을 테니 숙제를 맡아주세요.

관련 문제