Perl函数/子最佳实践

时间:2015-03-11 19:27:44

标签: perl

我有一个非常快速的问题。我有一个程序,有很多从main运行的函数。是最好的做法是首先使用main,然后是main的调用,或者反过来?

例如:

sub myFunction {
    #Do something
}

my $stuff = myFunction();

或者:

my $stuff = myFunction();

sub myFunction {
    #Do something
}

对于任何无知感到抱歉,我没有接受任何正式培训,我已经在网上看到了两种方式。感谢

2 个答案:

答案 0 :(得分:8)

我建议将代码放在底部。

第1期

后一个片段很差,因为myFunction$stuff的范围内,但它不应该。这很容易解决。

{
    my $stuff = myFunction();
}

sub myFunction {
    #Do something
}

好的,所以这不是一个大问题,因为我将所有顶级代码放在一个块中,即使它最后也是如此。它对我来说看起来更干净,并且它可以更容易地转换为我可以return的子。

sub myFunction {
    #Do something
}

sub main {
    return 0 if is_nothing_to_do();

    my $stuff = myFunction();
    ...

    return 0;
}

exit(main(parse_args));

第2期

许多语言要求您在调用潜艇之前声明它们。这在Perl中很少需要,尽管有几种情况需要它。有原型的子是其中之一。如果您想将代码放在顶部,则需要在此之前添加声明。

sub myFunction(&@);

{
    my $stuff = myFunction { ... } ...;
}

sub myFunction(&@) {
    #Do something
}

您可能永远不必这样做,因为不鼓励使用原型的一些罕见用途,其他情况甚至更少。

第3期

您可能会在子例程之前放置顶级代码,从而意外跳过初始化代码。

比较

print my_counter(), "\n";  # Warns, then prints a blank line

...

{
   my $counter = 1;
   sub my_counter {
      return $counter++;
   }
}

...

...

{
   my $counter = 1;
   sub my_counter {
      return $counter++;
   }
}

...

print my_counter(), "\n";  # Prints 1

第4期

许多语言要求您在调用潜艇之前声明潜艇,以便更多人更熟悉底层的顶级代码。

答案 1 :(得分:5)

无所谓,只要您能找到需要查找的代码即可。我通常喜欢这样设置我的代码:

use strict;
use warnings;

exit main();

sub main {
    do_this();
    dont_do_that();
    cant_you_read_the_signs();

    return 0;
}

sub do_this {
    ....
}

...

将主代码放在一个名为“main”的实际函数或块中,有助于防止使用全局变量污染程序。