Perl函数/子最佳实践

Cir*_*B0T 5 perl

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

例如:

sub myFunction {
    #Do something
}

my $stuff = myFunction();
Run Code Online (Sandbox Code Playgroud)

要么:

my $stuff = myFunction();

sub myFunction {
    #Do something
}
Run Code Online (Sandbox Code Playgroud)

对不起,我没有任何正式的培训,我已经在网上看到了两种方式.谢谢

ike*_*ami 8

我建议将代码放在底部.

问题1

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

{
    my $stuff = myFunction();
}

sub myFunction {
    #Do something
}
Run Code Online (Sandbox Code Playgroud)

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

sub myFunction {
    #Do something
}

sub main {
    return 0 if is_nothing_to_do();

    my $stuff = myFunction();
    ...

    return 0;
}

exit(main(parse_args));
Run Code Online (Sandbox Code Playgroud)

问题2

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

sub myFunction(&@);

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

sub myFunction(&@) {
    #Do something
}
Run Code Online (Sandbox Code Playgroud)

您可能永远不必这样做,因为除了一些罕见的原型用途之外,其他场景甚至更少见.

问题3

通过将顶级代码放在子例程之前,可能会意外跳过初始化代码.

相比:

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

...

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

...
Run Code Online (Sandbox Code Playgroud)

...

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

...

print my_counter(), "\n";  # Prints 1
Run Code Online (Sandbox Code Playgroud)

问题4

许多语言要求您在调用它们之前声明您的潜艇,因此更多人会更熟悉底层的顶级代码.


And*_*ter 5

没关系,只要你能找到你需要找到的代码.我通常喜欢这样设置我的代码:

use strict;
use warnings;

exit main();

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

    return 0;
}

sub do_this {
    ....
}

...
Run Code Online (Sandbox Code Playgroud)

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