Должен ли я использовать вложенные подпрограммы в Perl? - PullRequest
0 голосов
/ 01 октября 2010
  • У меня есть 5 Perl-файлов, которые являются скриптами проверки для 5 различных состояний моей среды.

    У каждого из них есть хотя бы пара подпрограмм.

  • До сих пор число штатов было ограничено 5, и они работали нормально. Но теперь у меня есть еще 20 состояний среды и, следовательно, еще 20 сценариев Perl в соответствии с текущим дизайном.

  • Я хочу переместить все пять сценариев в один сценарий, который принимает состояние в качестве аргумента и имеет 5 различных подпрограмм для 5 различных состояний.

    Таким образом, когда мне нужно добавить проверку для еще одного состояния, мне просто нужно будет определить новую подпрограмму вместо целого нового сценария Perl.

  • Проблема в том, что это будет означать использование вложенных подпрограмм (которые, как известно, встречаются с проблемами ), или развертывание самих подпрограмм.

Например,

оригинальные сценарии

$ cat verify1.pl
sub a1 {
    ...
}
sub b1 {
    ...
}
a1(); b1(); a1();
$ cat verify2.pl
sub a2 {
    ...
}
sub b2 {
    ...
}
sub c2 {
    ...
}
a2(); b2(); c2(); a2();
$

сводный скрипт

$ cat verify.pl
sub one {
    ...
}
sub two {
    ...
}
my ($arg) = @ARGV;
if ($arg == 1) {
    one();  # should do what verify1.pl did
}
elsif ($arg == 2) {
    two();  # should do what verify2.pl did
}
$

Что мне сделать, чтобы решить эту проблему?

Ответы [ 3 ]

6 голосов
/ 01 октября 2010
sub one {
    do 'verify1.pl';
}
sub two {
    do 'verify2.pl';
}

В долгосрочной перспективе, однако, лучше преобразовать ваши сценарии в модули, чтобы управлять сложностью современным и разумным способом.

2 голосов
/ 01 октября 2010

Вы можете разместить подпрограммы как обычно, как они должны быть.

sub a1 {
    ...
}
sub b1 {
    ...
}
sub a2 {
    ...
}
sub b2 {
    ...
}
sub c2 {
    ...
}
sub one {
    a1(); b1(); a1();
}
sub two {
    a2(); b2(); c2(); a2();
}
my ($arg) = @ARGV;
if ($arg == 1) {
    one();  # should do what verify1.pl did
}
elsif ($arg == 2) {
    two();  # should do what verify2.pl did
}
1 голос
/ 01 октября 2010

Я бы решил эту проблему, просто поместив все подпрограммы в один файл и переименовав все конфликтующие.

Однако, похоже, ваша проблема в том, что вы жестко программируете все возможные ситуации проверки, с которыми вы можете столкнуться. Лучший способ - создать процесс, в котором вы можете динамически создавать конвейеры проверки. Поскольку я не знаю, что вам нужно, я не знаю, подойдет ли вам что-то вроде Data :: Constraint или другие модули проверки. Очень сложно дать какой-либо полезный совет с таким небольшим количеством информации в вопросе.

...