我赞成这样的观点,即变量不应该在您要使用它们之前进行初始化。如果变量是由将使用它的代码来表示的,那么它可以更容易地记住变量代表什么,并且它减少了变量在初始化和正确使用之间被滥用的可能性。
当在一两个循环中使用该变量时就会出现问题。然后,初始化成本成倍增加,并且可能开始影响性能。
在 Perl 中(或通常,视情况而定),是否有任何精巧的小技巧允许您将变量的初始化放在循环中,但只在第一次传递时初始化?
我想到了这样的事情:
my $variable = undef;
while ($outer_loop) {
while ($inner_loop) {
$variable = $variable || 'initial_value'
}
}
注意:这意味着 $variable
不会在循环内重新分配。
现在也许是我,但这似乎有点不雅。
那么,这是我的问题:是否有更简洁的方法来做到这一点,或者我是否只需要克制自己并在代码组织上妥协,或者吸收上面那个“不雅”的解决方案?
最佳答案
要解决您评论中的问题(变量在函数中计算):
用于优化您想要的这种逻辑的标准技术称为内存(针对该函数)。在其他方法中,Perl 有
Memoize
模块,或者您可以自己做。use Memoize; memoize('slow_function'); while ($outer_loop) { while ($inner_loop) { my $variable = slow_function(arguments); } }
此外,如果函数在整个循环中始终产生 100% 相同的值(按设计),只需通过在循环之前的语句中初始化变量来执行穷人内存。
如果你有一个 3 页长的循环(例如,与循环内部相比,在循环之前进行初始化是一个可读性问题),那么你的编码问题不仅仅是初始化行的位置,并且需要首先重构您的代码。
顺便说一句,如果您唯一关心的是将变量放在循环之前,它会破坏“此变量仅供在此循环内使用”的可读性上下文,您可以通过以下任一方式轻松解决:
拥有良好记录的代码 - 相应地命名变量,或向初始化行添加注释,或两者兼而有之。
或者,通过将变量命名为
my $default_value_for_next_loop = long_func();
,并在循环内部实际创建一个本地循环变量,并从中初始化:my $loop_var = $default_value_for_next_loop;
此外,就您自己的方法而言 ($variable = $variable || 'initial_value';
);
我个人认为绝对优雅且可读,但是!!!我很确定它实际上比直接 $variable = $default_value_for_next_loop;
执行更差,因为它有一个条件语句而不是直接赋值。但如果不进行基准测试,我无法确定。
关于perl - 如何在不牺牲性能的情况下保持良好的代码组织?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4683857/