我正在使用常量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”;部分使用将成为无效.

在Perl中使用常量的更多相关文章

  1. 一 Swift学习之基础部分

    **一Swift学习之基础部分————–借鉴老码团队翻译组-Tyrion**//1.1常量和变量letsum=0//声明常量,值不可修改varnumber=1//声明变量,值可修改varx=0.0,y=1.0,z=2.0//在一行声明多个常量或变量用逗号隔开//1.2类型标注//声明常量或变量时可以加上类型标注,表示这个常量或变量存储的类型,但是如果你没有添加类型,而是赋了初始值,swift会自己推断类型letnum:Int=0varstr:String?Swift提供了两种有符号浮点数类型:Double

  2. Swift语法基础:8 - Swift的常量, 变量, 标注, 命名, 输出, 注释, 分号, 整数, 浮点数, 类型安全和类型推测说明

    Swift是一门新的语言,由于前期稳定性不够,所以导致会有一定的语法差异,有些人看到中文翻译过来的文档,和在Xcode里实现的不一样,就会各种找答案,找问题,我之所以会把我学习Swift遇到的问题共享出来,一方面是为了方便某人不愿意查看英文文档的朋友,另一方面就是为了给我自己做总结,是我在Xcode中一一试过,没有出现问题的我才会发出来,以后也会如此,直到Swift完全成熟稳定了,那我就以最后一个

  3. Swift入门教程:基本类型01

    一:基本数据类型整型:Int浮点型:Float,Double字符串:String集合类型:Array,Dictionary注意:1:基本数据类型的首字母都是大写2:不能写在变量或常量的前面二:变量格式:var变量名=变量值说明:编译器通过变量值来推断变量的类型vara=1//编译器通过值1来推断变量a是整型varb="haha"//编译器通过值haha来推断变量b是字符串varc=true//编译

  4. Swift教程 第一章 基础部分

    Swift是iOS和OSX应用开发的一门新语言,Swift的类型是在C和Object-C的基础上提出来的。Int是整型,Double和Float是浮点型,Bool是布尔型,String是字符串。Swift还有两个常用的集合类型:Array数组和Dictionary字典。除了我们熟悉的类型,Swift还增加了Object-C中没有的类型,比如元组。Swift还增加了可选类型,用于处理值缺失的情况。常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。

  5. Swift编程高级教程一变量与常量

    常量和变量的声明Swift中的常量和变量在使用前必须先声明。提示实际应用中很少需要指定变量数据类型,Swift会根据所设置的值的类型进行推导。命名规则Swift中可以使用任意字符给常量和变量命名,包括Unicode编码,比如中文、Emoji等:名字里面不能包含数学运算符、箭头、非法的Unicode字符以及不能识别的字符等,并且不能以数字开头。同一个作用域的变量或者常量不能同名。

  6. Swift编程高级教程 变量与常量

    提示实际应用中很少需要指定变量数据类型,Swift会根据所设置的值的类型进行推导。Swift使用字符串插值来输出变量和常量。Swift中并没有所谓的实例变量,而是将它们统一为属性了,这样使得属性的声明更加简化。Size封装了宽度和高度。而let只能用于常量的声明,表示它们的值不能发生改变。但是在Swift中可以直接将它们定义为类型的一部分。

  7. Swift编程高级教程(三)集合类型-数组

    集合类型―数组Swift语言提供了两种集合数据类型:数组和字典,数组是一系列相同类型的变量值有序存储;字典是一系列相同类型的变量值的无序存储,可以通过一个唯一标识符(键)来引用和查找。提示Swift的数组类型的变量在常量,变量赋值或者给函数和方法传参的时候会表现出和其他类型不一样的行为。故Swift的数组是类型安全的!

  8. swift语言学习-9. 闭包

    swift中有个sorted函数,用来数组排序。sorted函数有2个参数,第一个参数是数组,第二个参数传入一个闭包函数。闭包的函数体部分由关键字in引入。Swift最简单的闭包形式是嵌套函数,也就是定义在其他函数的函数体内的函数。闭包是引用类型上面的例子中,incrementByTen是常量,但是这些常量指向的闭包仍然可以增加其捕获的变量值。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  9. Swift学习:1.常量与变量

    复习Swift语言,总结一下知识点,记录下来,方便以后查阅。你可以在一行中声明多个常量或者多个变量,用逗号隔开:NOTE:如果你的代码中有不需要改变的值,请使用let关键字将它声明为常量。

  10. Swift语言指南一基础知识

    Swift是用于开发iOS和OSX的一门新编程语言。尽管如此,Swift的大部分地方看着其实跟C和Objective-C都是挺像的。Swift提供了C和Objective-C基础类型的自己一套版本,包括用于整型的Int,用于浮点值的Double和Float,用于布尔值的Boolean,和用于文本数据的String。Swift还支持值不能变的变量。常量用于整个Swift中,让你在处理不需要改变值的时候使得代码更安全和简洁。除了熟悉的类型,Swift还加入了Objective-C里没有的类型,比如元组。Swi

随机推荐

  1. 数组 – Perl中有什么神奇的数组?

    在Perldocumentationforreverse中,我发现:“请注意,将数组反转到自身(如@a=reverse@a)将尽可能保留不存在的元素;即对于非魔法数组或具有EXISTS和DELETE方法的绑定数组.什么属性区分神奇和非魔法阵列?解决方法一个神奇的阵列是一个执行它的操作不仅仅是改变内容.只有内置的魔术阵列是@ISA,而且这是非常不明显的.正如句子所暗示的,魔术阵列主要是一个绑定的阵列

  2. perl – 使用“isa”方法的最佳方式?

    什么是“最好的”使用方式“isa()”可靠?解决方法Scalar::Util实现明确更好.它避免了eval{}的开销,它总是导致设置一个附加变量.Scalar::Util实现更容易阅读.如果eval也失败了,我相信发生的是你在树之前向后走到eval之前的状态–这是如何实现复位状态.这带来了额外的故障开销.基准根本不是一个对象对象传递isa检查对象出现故障现象检查测试代码:我使用这是为i486-linux-gnu-thread-multi建立的perl,v5.10.1(*),以及Scalar::Util,1

  3. 在CORE :: GLOBAL中哪些Perl内置函数不能被覆盖?

    解决方法toke.c中任何值为负的值都可以被覆盖;所有其他人可能不会.你可以看源码here.例如,我们来看看第10,396行的waitpid:由于waitpid为负数,因此可能会被覆盖.grep怎么样?这是积极的,所以不能被覆盖.这意味着以下关键字不能被覆盖:chop,defined,delete,do,dump,each,else,elsif,eval,exists,for,foreach,format,glob,goto,grep,if,keys,last,local,m,map,my,next,no

  4. 如何在Perl中打印由换行符分隔的列表元素?

    什么是最简单的打印所有列表的元素以Perl中的换行符分隔的元素?解决方法在Perl5.10中:其他方式:或:或者怎么样?

  5. 使用Perl如何获取文件大小(以兆字节为单位)?

    我想以磁盘的形式获取磁盘上的文件大小.使用-s运算符给出了以字节为单位的大小,但是我将假设,然后将其除以魔术数字是一个坏主意:我应该使用只读变量来定义1024,还是有一种编程方式来获取一千字节的字节数?

  6. perl – 如何测试/分类CPAN模块的utf8正确性

    例如:File::Slurp,如果你将读取该文件您将根据命令行开关获得不同的结果,并且perl-CSDA将无法正常工作.伤心.(是的,我知道比Encode::decode(“utf8”,read_file($file,binmode=>’:raw’));将帮助,但是SAD.我的问题:>在这里任何首选方式,如何测试/分类什么CPAN模块是utf8安全/准备/正确?>这里是像Perl::Criticforutf8这样的东西–什么将检查模块源可能的utf8不正确?总结以上是DEVMAX为你收集整理的perl–如

  7. 如何删除Perl字符串中的空格?

    如果我声明一个值为’3’的变量$myString.是否有任何功能来删除返回值的空格.有点像SomeFun然后返回’3′.输出:你可以注意到’vid’=>‘0’,上面的代码从theanswer.我正在研究它.总结以上是DEVMAX为你收集整理的如何删除Perl字符串中的空格?如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  8. 如何在mod_perl2下运行Devel :: Cover?

    Unfortunately,Devel::Coverdoesnotyetworkwiththreads.它也不适用于prefork.在startup.pl中使用,Devel::Cover问题perl5.8.9,Apache2.2.13.我的操作系统是FreeBSD,如果重要.同样的问题是reportedforwin32.更新:PerlTrace全部输出解决方法邪恶之源似乎是Apache::DBI.

  9. 如何使用Perl中的C类?

    我有一套用C写的课.从Perl脚本中调用它们的最佳方法是什么?

  10. perl – 在Emacs中以双模式更好的缩进

    我正在使用Emacs来修改Perl和Verilog交织的代码.我正在使用two-mode-mode在两者之间切换,这样可以预期.问题是perl代码与//一行一行地表示;如下图所示:而双模式则认识到它是Perl,它是逐行的,所以缩进等在线上无意义.我想做的是使Perl代码像往常一样格式化,但忽略//;字符.有什么想法吗?我刚刚开始偷看模式文件,它们是可以理解的复杂的,所以任何提示都不会感激!

返回
顶部