我正在寻找关于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.