我正在寻找有关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+,请使用state
变量。
use feature 'state';
# use 5.010; also works
sub womble {
state $foo = something_expensive();
return $foo ** 2;
}
只会调用
something_expensive
一次。如果您需要使用较早的perls,请在外部作用域中使用带有附加括号的词汇变量:
{
my $foo = something_expensive();
sub womble {
return $foo ** 2;
}
}
这可以防止
$foo
泄漏给womble
以外的任何人。
关于perl - Perl中的静态局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10841076/