加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中使用常量

发布时间:2020-12-15 21:11:42 所属栏目:大数据 来源:网络整理
导读:我正在使用常量pragma来定义Perl中的常量: use constant { FOO = "bar",BAR = "foo"}; 我遇到麻烦,希望有一个标准的处理方式. 首先… 我正在为Subversion定义一个钩子脚本.为了使事情变得简单,我想要一个文件,我使用的类(包)与我的实际脚本在同一个文件中.
我正在使用常量pragma来定义Perl中的常量:
use constant {
    FOO => "bar",BAR => "foo"
};

我遇到麻烦,希望有一个标准的处理方式.

首先…

我正在为Subversion定义一个钩子脚本.为了使事情变得简单,我想要一个文件,我使用的类(包)与我的实际脚本在同一个文件中.

这个包中的大部分都会涉及到它的常量:

print "This is my program";

 package MyClass;

 use constant {
    FOO => "bar"
 };

 sub new { ... }

我希望我的常规FOO可以访问我的主程序.我想这样做,而不必将其称为MyClass :: FOO.通常,当程序包是单独的文件时,我可以在我的主程序中执行此操作:

use MyClass qw(FOO);

但是,由于我的类和程序是单个文件,我不能这样做.我的主程序能够访问我课堂中定义的常量的最佳方法是什么?

第二个问题…

我想使用常量值作为散列键:

$myHash{FOO} = "bar";

问题是%myHash的文本字符串FOO作为键,而不是常量的值.当我这样做的时候会造成问题:

if (defined $myHash{FOO}) {
   print "Key " . FOO . " does exist!n";
}

我可以强制上下文:

if (defined $myHash{"" . FOO . ""}) {

我可以添加括号:

if (defined $myHash{FOO()}) {

或者,我可以使用一个临时变量:

my $foo = FOO;
if (defined $myHash{$foo}) {

这些都不是处理这个问题的好方法.那么最好的方法是什么?有没有一种我失踪的方式?

顺便说一下,我不想使用Readonly :: Scalar,因为它是1).慢,和2).不是标准Perl包的一部分.我想定义我的钩子不需要额外的Perl包,并尽可能简单的工作.

解决方法

如果要将所有内容保存在同一个文件中,可以按如下方式定义常量包:
use warnings;
use strict;

BEGIN {  # BEGIN means this will all happen at compile time
    package Constants;

    $INC{'Constants.pm'}++;     # tell `require` that the package is loaded
    use base 'Exporter';        # setup package to export
    our @EXPORT_OK = qw( PI );  # what to export

    use constant PI => 3.14159; # define your constant
}

package main;

use Constants qw( PI );  # use it like normal

print PI;

然后愚弄哈希下标中的自动引用,你可以这样写:$hash {PI}或$hash {(PI)}或$hash {PI()}或$hash {& PI}或$hash {:: PI} …我可能会继续前进,但我想你得到点.

需要$INC {‘Constants.pm’}的原因是因为使用常量qw(PI);线真的意思是:

BEGIN {
    require 'Constants.pm';
    Constants->import( qw( PI ) );
}

并且要求将检查%INC,以查看包装是否已经加载.所以给它一个真正的价值(在这种情况下为1),需要“Constants.pm”;部分使用将成为无效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读