【问题标题】:Making a tidy (perl) return做一个整洁的(perl)返回
【发布时间】:2015-08-27 17:03:58
【问题描述】:

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

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

我写了一个对所有返回点执行此操作的子程序。但是,我能想到的唯一使用方法就是拥有

tidy_up();
return (LIST);

我希望有一个 sub 接受返回值 LIST 并让该 sub 也返回到调用脚本:

tidy_up_and_return(LIST);

这可能吗?

【问题讨论】:

    标签: perl return subroutine


    【解决方案1】:

    这可能不是一个好主意。在调用者上下文周围有很多微妙的陷阱等待发生。

    但是 - 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;
    

    对比

    sub parent2 {
        my @results = ( "one", "two" );
        return ( @results, "some_other_value" );
    }
    
    my $result =  parent2();
    print $result;
    

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

    【讨论】:

    • 好的,令人信服,但我有多个返回点,有些是错误返回,有些返回不同的列表。除了最后一个范围之外,explicit return 是必须的,不是吗?
    • 是的。隐式返回仅在您的子结束时有效。我一般不喜欢隐式返回 - 它们是将来解决问题的好方法,因为有人在结尾添加了一个“打印”,以诊断某些事情。
    • 谢谢!嗯,再多一条线不会太痛苦吧?
    • 谢谢!我也不喜欢“默认值”。除了您的示例之外,它对新手来说晦涩难懂,并且可能会更改。我允许自己的唯一例外是在使用 'shift;' 的 sub 中提取输入参数时。它更容易维护。即使在那里,当列表超过 3 或 4 时,我也会恢复传递(对 a 的引用)哈希。嗯,再多一条线不会太痛苦吧?
    • 编写代码时唯一真正重要的是它的可读性。将其布置为最大程度的整洁、优雅和清晰,让其余部分自行处理。它几乎总是可以正常工作,并且在您需要更快速度的特殊情况下,您应该使用分析器来找出优化的重点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多