perl - Perl中的静态局部变量

标签 perl scope

我正在寻找有关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/

相关文章:

c++ - 有没有办法延长 C++ 中临时对象的生命周期?

dynamic - 什么是具有动态范围和静态类型的编程语言?

javascript - 无法使用 perl WWW::Mechanize 勾选复选框

linux - Bash oneliner 重命名文件名

c++ - 通过使用全局变量的函数访问在给定范围内被覆盖的变量

c++ - 为什么具有相同名称但不同签名的多重继承函数不被视为重载函数?

基于插件/创作文章的插件的 jQuery 范围设置

Perl - 如何请求 HTTPS 网站

regex - 如何找到下一个不平衡的支撑?

perl - 如何使用 Perl 在 SFTP(版本 3)中将传输模式设置为 ASCII