一个比较困惑的问题(我也概括不出来问题在哪)

一个比较困惑的问题(我也概括不出来问题在哪)

是这样的,我需要一个测试模块可用性的脚本,但发现如果用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所在的元素就凭空消失了?这是怎么工作的?望各位高人指教,多谢!

perldoc -f eval
perldoc -f scalar
关键词:
* 上下文
Still没看懂……   能不能解释一下?


QUOTE:
原帖由 JasonLee8872 于 2008-2-22 11:14 发表
Still没看懂……   能不能解释一下?

我很忙,没时间拔毛助长。
您觉得自己很了不起?不想回答您可以不理我,不需要这样人身攻击。
首先根本不存在有人忙到始终抽不出一两分钟的,如果真的有人这么忙的话,已经不可能还活着。
其次,你们这些只管叫人看书看文档的人非常莫名其妙,各自有各自的思维、有各自的学法,我可以告诉你一个讲逻辑的人随时都会选择最简单最通俗的途径,即便接触的是最尖端领域,也可以像白痴一样问简单问题,只要这对了解信息有用。
最后,不要以为自己很了不起。
针对这种情况flw都是这样的表达方式。对事不对人,不用这么大的反应。

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

#!/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";
}


错了就改



QUOTE:
原帖由 cobrawgl 于 2008-2-22 16:52 发表
('a' => undef, 'b' => 1) == ('a' , , 'b', 1) == ('a', 'b', 1)

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

你错了。


QUOTE:
原帖由 flw 于 2008-2-22 16:53 发表

你错了。

还请版主指点啊