免费注册 查看新帖 |

Chinaunix

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

一个比较困惑的问题(我也概括不出来问题在哪) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-22 10:42 |只看该作者 |倒序浏览
是这样的,我需要一个测试模块可用性的脚本,但发现如果用Hash会出这么一个问题。

代码如下:
#!/usr/bin/perl

use strict;

my %aa = (
    "a" => eval {require CGI; 1},
    "b" => eval {require DBI; 1}
);

foreach (keys %aa) {
    print "$_ = $aa{$_}\n";
}


首先,若CGI和DBI都存在,则得到期望的结果:
a = 1
b = 1

但,如果第一个即CGI不存在(把require CGI随便换成什么乱七八糟的模块名),则得到了非常荒诞的:
1 =
a = b

这是怎么回事?如果测试失败的话,eval不是返回undef吗?但这个结果看起来似乎返回了:
%aa = ("a" , "b" , 1)


eval所在的元素就凭空消失了?这是怎么工作的?望各位高人指教,多谢!

[ 本帖最后由 JasonLee8872 于 2008-2-22 10:44 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-02-22 10:54 |只看该作者
perldoc -f eval
perldoc -f scalar
关键词:
* 上下文

论坛徽章:
0
3 [报告]
发表于 2008-02-22 11:14 |只看该作者
Still没看懂……   能不能解释一下?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2008-02-22 11:21 |只看该作者
原帖由 JasonLee8872 于 2008-2-22 11:14 发表
Still没看懂……   能不能解释一下?

我很忙,没时间拔毛助长。

论坛徽章:
0
5 [报告]
发表于 2008-02-22 11:33 |只看该作者
您觉得自己很了不起?不想回答您可以不理我,不需要这样人身攻击。
首先根本不存在有人忙到始终抽不出一两分钟的,如果真的有人这么忙的话,已经不可能还活着。
其次,你们这些只管叫人看书看文档的人非常莫名其妙,各自有各自的思维、有各自的学法,我可以告诉你一个讲逻辑的人随时都会选择最简单最通俗的途径,即便接触的是最尖端领域,也可以像白痴一样问简单问题,只要这对了解信息有用。
最后,不要以为自己很了不起。

论坛徽章:
0
6 [报告]
发表于 2008-02-22 16:32 |只看该作者

回复 #5 JasonLee8872 的帖子

针对这种情况flw都是这样的表达方式。对事不对人,不用这么大的反应。

虽然我不能说出具体的理论错误,不过可以说说我的看法。这里出现这样原因我想是%aa的赋值问题,
因为我们把a,b的赋值语句调换下就变成正常的了,如果a,b的赋值都是undefined,那么就变成了a=b,
所以我想是由于哈希数据在赋值时候键或者值必须是defined的,不然他会自动把下一个值替换到前面的位置。通过scalar %aa 也能看到其键值对有多少个。具体可以查看
http://bbs.chinaunix.net/viewthr ... mp;highlight=scalar
希望能对你有所帮助

论坛徽章:
0
7 [报告]
发表于 2008-02-22 16:41 |只看该作者
我改了改,不知道是不是你想要得结果

#!/usr/bin/perl



use strict;

my %aa = (
    a => eval {eval {require CGI; 'CGI found!'} or 'CGI not found!';},
    b => eval {eval {require DBI; 'DBI found!'} or 'DBI not found!';},
);

foreach (keys %aa) {
    print "$_ => $aa{$_}\n";
}


[ 本帖最后由 cobrawgl 于 2008-2-22 16:45 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-02-22 16:52 |只看该作者
错了就改

[ 本帖最后由 cobrawgl 于 2008-2-22 16:55 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2008-02-22 16:53 |只看该作者
原帖由 cobrawgl 于 2008-2-22 16:52 发表
('a' => undef, 'b' => 1) == ('a' , , 'b', 1) == ('a', 'b', 1)

'=>' 跟 ',' 是一个意思。

你错了。

论坛徽章:
0
10 [报告]
发表于 2008-02-22 16:54 |只看该作者
原帖由 flw 于 2008-2-22 16:53 发表

你错了。


还请版主指点啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP