Какая выгода имеет "sub main ... & main ();" подход (sub-main-pattern) в Perl? - PullRequest
15 голосов
/ 20 июля 2011

Несколько лет назад я применил следующий «шаблон» для всех, кроме самых простых из моих сценариев Perl: (Я даже не помню, где я его впервые увидел, это, конечно, не было моей подлинной идеей.)

use strict;
...
sub main {
  ...
}
... possibly more subs ...

... at the end of the file:
#############
# Call main #
&main();
#############

Есть ли польза от этого? Я нахожу код немного чище, но в остальном я не уверен, что это имеет какую-то другую цель, кроме как сделать программиста на C во мне счастливым: -)

Любые идеи экспертов Perl и опытных пользователей приветствуются. (Я, конечно, ни один)

Ответы [ 5 ]

11 голосов
/ 20 июля 2011

Это известная идиома по ограничению объема.Это обсуждается в https://stackoverflow.com/q/1183876#comment-1012787 ff.и http://use.perl.org/comments.pl?sid=43991&cid=70918 ff.

7 голосов
/ 20 июля 2011

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

Лично я использовал

{
   ...  # Extract command line switches from @ARGV
   ...  # Perform input validation
   exit(main(@ARGV));
}
5 голосов
/ 20 июля 2011

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

Одна особенность заключается в том, что такие команды, как:

my $arg = shift;

Влияет на @_ вместо @ARGV, и @ARGV не будет автоматически передано main(). @ARGV все еще будет виден внутри сабвуфера, но вам придется явно сместить его shift @ARGV.

3 голосов
/ 20 июля 2011

Одним из преимуществ может быть то, что он упрощает превращение вашей программы в modulino .

1 голос
/ 20 июля 2011

Сделав много Perl, я бы сказал, что это то, что делает тебя счастливым. Я сомневаюсь, что это быстрее или медленнее.

Просто, чтобы сделать мой ответ несколько полезным, я укажу, что вам не нужно & при вашем дополнительном вызове. & делает @_ видимым для сабвуфера, но пустые парены это отрицает.

...