如何在Perl中的单独文件中定义常量?

Sua*_*uan 15 perl constants

我有一堆Perl文件,它们接受一些文件名常量.我想在一个单独的文件中定义它们 - 类似于C中的头文件.在Perl中执行此操作的最佳/最标准方法是什么?

Sin*_*nür 16

在Perl中没有与C头文件等效的东西.要声明和定义全局常量,可以使用define pragma.虽然界面看起来很合理,但我对此模块没有任何经验.

另一方面,您可以编写一个模块来定义常量并使用它们将它们导入模块use.例如:

package MyConstants;

use strict; use warnings;

use Exporter qw( import );
use Const::Fast;

our @EXPORT = qw();
our @EXPORT_OK = qw( $X $Y );

const our $X => 'this is X';
const our $Y => 'this is Y';

__PACKAGE__;
__END__
Run Code Online (Sandbox Code Playgroud)

然后,您可以按如下方式使用此模块:

#!/usr/bin/perl

use strict; use warnings;

use MyConstants qw( $X );

print "$X\n";
print "$MyConstants::Y\n";
Run Code Online (Sandbox Code Playgroud)

如果您可以使用完全限定的变量名称(例如$MyConstants::Y),则根本不需要Exporter.

另外,确保导出的变量在其他地方不可修改(请参阅Exporter文档中的注意事项).

当然,您也可以使用constant.pm定义常量.使用这些常量可能会更快,但如果你需要在字符串中插入它们,它们就会很笨拙.

  • Readonly ::如果你安装了Readonly :: XS,Scalar也很快.哈希和阵列仍然较慢. (3认同)
  • @Robert P,IMO根据请求导出变量是合理的,默认情况下最好避免导出一个(或更多!).如果在上面的例子中,我期望多次使用$ X并且想要避免在任何地方不必要地重复输入`$ MyConstants :: X`,这将是一个巨大的好处.导入变量的另一种情况是,如果我不小心尝试使用`$ MyConstants :: x`,没有`strict`生成的错误消息会提醒我我的错误,而如果我导入`$ X`并尝试使用`$ x`,严格通过捕获错误来保存当天. (2认同)

Chr*_*ons 7

我们通常使用模块名称Constants来执行此操作.就像是:

package MyPackage::Constants;

our $DIR = "/home/chriss";
our $MAX_FILES = 5;

1;
Run Code Online (Sandbox Code Playgroud)

然后,使用它:

package MyPackage;
use MyPackage::Constants;

open(my $fh, ">", $MyPackage::Constants::DIR . "/file");
Run Code Online (Sandbox Code Playgroud)

如果您不想一直引用该包,可以使用Exporter并引入您想要的所有符号.

  • 这看起来像配置,而不是常量. (4认同)
  • 为什么不在MyPackage模块本身中定义MyPackage常量,而不是创建一个新的命名空间?如果你将常量引用为namespace :: DIR,则会失去继承的优势,即MyPackage :: Child :: Constants不能从MyPackage :: Constants继承并覆盖DIR的值.namespace-> DIR要好得多. (3认同)
  • 另外,为什么将这些声明为变量而不是常量?见Sinan的帖子描述的http://perldoc.perl.org/constant.html. (2认同)

Dav*_*ous 5

这听起来像配置设置,最好放在您使用各种CPAN模块之一解析的配置文件中,例如Config :: Any.

配置是数据,IMO不应该在您的代码中.