做一个整洁的(perl)返回

做一个整洁的(perl)返回,perl,return,subroutine,Perl,Return,Subroutine,这很可能是一个愚蠢的问题,但下面是: 在许多模块中,我有多个返回调用脚本的点。但在实际返回之前,我需要做一些整理工作,例如将目录更改为父目录,等等 我写了一个sub,它对所有的返回点都这样做。然而,我能想到的使用它的唯一方法是 tidy_up(); return (LIST); 我希望有一个sub接受返回值列表,并让该sub也返回到调用脚本: tidy_up_and_return(LIST); 这可能吗?这可能不是个好主意。在调用方上下文中有一系列微妙的陷阱等待着发生 但是-return实际

这很可能是一个愚蠢的问题,但下面是:

在许多模块中,我有多个返回调用脚本的点。但在实际返回之前,我需要做一些整理工作,例如将目录更改为父目录,等等

我写了一个sub,它对所有的返回点都这样做。然而,我能想到的使用它的唯一方法是

tidy_up();
return (LIST);
我希望有一个sub接受返回值列表,并让该sub也返回到调用脚本:

tidy_up_and_return(LIST);

这可能吗?

这可能不是个好主意。在调用方上下文中有一系列微妙的陷阱等待着发生

但是-
return
实际上不是sub所需的-如果没有
return
sub将隐式返回上次计算的结果

#!/usr/bin/env perl

use strict;
use warnings;

sub parent { 
   my @results = ( "one", "two" ); 
   child ( @results, "some_other_value" ); 
}

sub child {
   return ( @_ ); 
}

print parent();
因为
child
返回它的参数-因为
parent
的最后一行是调用
child
-然后
parent
隐式返回
child
的结果

我建议你不要这样做,我称之为坏风格——未来的维护程序员不一定知道你在做什么

您可以通过以下方式稍微改善这一点:

return child ( @results, "some_other_value" ); 
但请记住,您可能会在返回上下文中出现一些轻微的异常-例如:

#!/usr/bin/env perl

use strict;
use warnings;

sub parent {
    my @results = ( "one", "two" );
    return child( @results, "some_other_value" );
}

sub child {
    return (@_);
}

my $result =  parent();
print $result;
vs


看起来非常相似,但由于操作的上下文,结果不同

好的,令人信服,但我有多个返回点,一些是错误返回,另一些返回不同的列表。在除最后一个范围外的所有范围中,显式返回都是必须的,不是吗?是的,是的。隐式返回只在sub的末尾起作用。我一般不喜欢隐式返回-它们是将来解决问题的好方法,例如,有人在末尾添加“打印”来诊断某些问题。谢谢!嗯,再多说一句也不太痛苦,对吧?谢谢!我也不喜欢“默认值”。除了你的例子之外,它对新手来说是晦涩难懂的,而且不好用,它可能会被改变。我允许自己的唯一例外是在使用“shift;”提取sub中的输入参数时它更容易维护。即使在那里,当列表长度超过3或4时,我也会返回传递(对)散列的引用。好吧,多写一行代码不会太痛苦,对吧?编写代码时唯一真正重要的是它的可读性。为了最大程度的整洁、优雅和清晰,把它摆出来,让其他的东西自己照顾自己。它几乎总是工作得很好,在需要更快一点的奇怪情况下,您应该使用分析器来找出优化的重点。
sub parent2 {
    my @results = ( "one", "two" );
    return ( @results, "some_other_value" );
}

my $result =  parent2();
print $result;