2010-01-05 2 views
0

Я написал скрипт Perl для чтения файла конфигурации и создания сценариев CGI. Это отлично работает, и я получаю вывод скрипта 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

Несколько сценариев на основе шаблонов (почти) никогда не имеют правильного ответа.

Используйте структуры данных из файла конфигурации и структур управления, чтобы получить нужное поведение.

Вместо того, чтобы использовать шаблон для создания такого кода:

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 ], 
}; 

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

Вы можете связать конфигурации данных в подпрограмму (то есть «Карри своих функций»), генерируя с информацией о конфигурации:

# 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. Как вы это делаете, это ваше домашнее задание, так как я не собираюсь пускать пули в пистолет для вас.

Смежные вопросы