Perl中的静态局部变量

前端之家收集整理的这篇文章主要介绍了Perl中的静态局部变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找关于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.

猜你在找的Perl相关文章