Perl函数/子程序最佳实践

5

我有一个非常简短的问题。我有一个带有许多从主函数运行的函数的程序。最佳实践是先定义函数,然后再在主函数中调用它们,还是相反?

例如:

sub myFunction {
    #Do something
}

my $stuff = myFunction();

或者:

my $stuff = myFunction();

sub myFunction {
    #Do something
}

非常抱歉,我没有接受过任何正式培训,我在网上看到过两种不同的做法。谢谢。


2
我认为最好将子程序放在最后。通常,子程序应该被包含并具有明确的目的,例如 sub listfiles,这样你通常不需要实际阅读代码。如果你有很多子程序,你可能想创建一个模块或多个模块来创建一些结构。 - TLP
2个回答

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++;
   }
}

...

and

...

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

...

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

问题4

许多语言要求在调用函数之前声明它们,因此更多的人会更熟悉将顶层代码放在底部。


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”的实际函数或块中可以帮助您避免在程序中使用全局变量。


FYI,我的答案列出了四种它确实很重要的方式,尽管你已经解决了其中之一。 - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接