我正在寻找关于Perl最佳实践的建议.我写了一个复杂的正则表达式的脚本:
my $regex = qr/complicated/; # ... sub foo { # ... if (/$regex/) # ... }
其中foo是一个经常被调用的函数,$regex在该函数之外不被使用.处理这样的情况最好的办法是什么?我只想把它解释一次,因为它是漫长而复杂的.但是在全局范围内看起来好像有点问题,因为它只在该子系统中使用.有合理的方式来声明它是静态的吗?
另一个可能是不合理的全球性也出现了类似的问题.它读取当前日期和时间并适当地格式化.这也被使用了很多次,而且仅在一个功能中使用.但是在这种情况下,更重要的是它不会被重新初始化,因为我希望日期时间的所有实例从脚本的给定调用中都是相同的,即使在执行期间分钟滚动也是如此.
目前我有点像
my ($regex,$DT); sub driver { $regex = qr/complicated/; $DT = dateTime(); # ... } # ... driver();
这至少有点隔离.但也许有更好的方法.
再次:我正在寻找正确的方法来做到这一点,遵循以下最佳实践和Perl习语.性能很好,但是如果我不能拥有一切,可读性和其他需求就会优先.
解决方法
如果您使用的是perl 5.10,请使用状态变量.
use feature 'state'; # use 5.010; also works sub womble { state $foo = something_expensive(); return $foo ** 2; }
只会打电话给一些廉价的一次.
如果您需要使用旧的Perl,那么在外部范围中使用一个词法变量,并使用一对额外的大括号:
{ my $foo = something_expensive(); sub womble { return $foo ** 2; } }
这让$foo从泄漏到任何人,除了womble.