免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5911 | 回复: 14
打印 上一主题 下一主题

问个关于常量访问的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-28 18:45 |只看该作者 |倒序浏览
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. use constant TUBE => 0;
  5. use constant ELBO => 1;

  6. my %com = (
  7. "gtype" => "TUBE",
  8. );
  9. print TUBE."\n";
  10. #想要通过$com{gtype}返回的字符串所代表的常量值控制输出,(比如说常量TUBE的值)怎么实现呢?
  11. print "$com{gtype}\n" if $com{gtype};


复制代码

[ 本帖最后由 sotol 于 2007-12-28 18:52 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-12-29 09:55 |只看该作者
对于常量访问,是不需要加双引号的.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2007-12-29 10:15 |只看该作者
又见符号引用。
死也不告诉你们怎么做。叫你不用 hash。

论坛徽章:
0
4 [报告]
发表于 2007-12-29 11:37 |只看该作者

回复 #3 flw 的帖子

想用PERL构建一个化工管道元件的基础类,然后用它实现化工三维设计数据库的操作
困难重重哈

我问这个问题的背景是:
化工管件的端面数是不一样的,比如书ELBO有三个,而TEE有两个
想根据管件的类型来动态生成三个或者两个端面,具体类型在CLASS C才能确定的
第一层:CLASS A 管件基本描述类, CLASS B 管件端面信息类;
第二层:CLASS C 具体管件的某个管件(继承A ,use B)。

PS:有点C++的基础,第一次使用PERL实现面向对象编程,稍微看了看了一下《PERL语言编程》。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2007-12-29 12:00 |只看该作者
那好,我来问你,如果是 C++,你该怎么做?

论坛徽章:
0
6 [报告]
发表于 2007-12-29 13:12 |只看该作者

回复 #5 flw 的帖子

按照我问到的那种思路方式,用C++也是实现不了的,明白你的意思是叫我用hash代替constant使用。PERL实现面向对象搞得头都有点晕了,可能是没有充分明白它的思想吧。要找点比较典型一点的代码参考一下才行。谢谢版主!

论坛徽章:
0
7 [报告]
发表于 2010-04-19 12:47 |只看该作者
楼主的问题解决没?

我最近也遇到跟楼主一样的问题,就是需要根据一个外部传入的变量来访问一个常量,该变量的值是未知的,是其中一个常量名。

在楼主的代码中,%com 应该是不存在的,只是一个示例,目的也是通过一个变量来访问常量。

论坛徽章:
0
8 [报告]
发表于 2010-04-19 13:18 |只看该作者
本帖最后由 hp_truth 于 2010-04-19 13:53 编辑

回复 1# sotol


试试这样:


#!/usr/local/bin/perl5

use warnings;
use strict;

use constant TUBE => 0;
use constant ELBO => 1;

my %com = ("gtype" => "TUBE");

no strict "refs";
print $com{gtype}(). "\n" if $com{gtype};



In the current implementation, scalar constants are actually inlinable subroutines. As of version 5.004 of Perl, the appropriate scalar constant is inserted directly in place of some subroutine calls, thereby saving the overhead of a subroutine call.

Constants are not private to the lexical scope in which they occur. Instead, they are simply argumentless subroutines in the symbol table of the package issuing the declaration.

论坛徽章:
0
9 [报告]
发表于 2010-04-19 13:37 |只看该作者
回复  sotol


试试这样:


#!/usr/local/bin/perl5

use warnings;
use strict;

use constan ...
hp_truth 发表于 2010-04-19 13:18



   
谢谢,这样的确可以,有没有其他更好的办法可以“用变量的值来访问常量”?

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
10 [报告]
发表于 2010-04-19 13:51 |只看该作者
  1. use constant TUBE => 1;

  2. my %com = (
  3. "gtype" => TUBE
  4. );

  5. print TUBE."\n";
  6. print "$com{gtype}\n";
复制代码
  1. 1
  2. 1
复制代码
二楼说的不用引号不就可以了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP