免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: neil_young
打印 上一主题 下一主题

web应用mod_perl中的变量申明问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-22 13:43 |显示全部楼层 |倒序浏览
我用的是Apache+perl 做的web管理系统,现在碰到几个让我迷惑的事情。
我要在一个pl文件,或者说是那种包内部申明一个私用的包内全局变量。
我举个例子,只是示意,PrintToPage函数是个假定输出到HTML页面上显示的函数。
#!/usr/bin/perl -w
my $a=1;
PrintToPage "初始:",$a;
changea();
PrintToPage "结束:",$a;

sub changea
{
PrintToPage "函数内:",$a;
$a=2;
}

预期结果应该是打印出
初始:1
函数内:1
结束:2

我在IE里访问该pl文件,第一次执行后,得到了预期结果,可当我再次执行这个pl时,却得到了
初始:1
函数内:2
结束:1
在以后的执行里也将一直得到这个结果,似乎是changea()这个函数在执行过一次后,自己内部申明保存了$a这个变量,这是怎么回事啊?

然后我把申明中的 my $a 替换成了 our $a, 却出现了另外的问题
用our申明的变量,在第二次执行时会记忆住第一次执行完时该变量保存的值。
例如
#!/usr/bin/perl -w
our $a;
PrintToPage "初始:",$a;
$a=2;
PrintToPage "结束:",$a;

当我们第二次访问该pl文件时会输出
初始:2
结束:2
实际上初始值并没有定义。请问这个如何解释?

后来我们采用了local our的定义方式,这两个问题都得到了解决,可是我不太清楚,local our定义的变量算是怎么回事。

[ 本帖最后由 neil_young 于 2005-11-23 10:40 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-11-22 14:00 |显示全部楼层
谢谢楼上的,不过我看了很多介绍说已经不建议使用local了,不过我们最后用的方案是local our来定义,似乎是解决了这个问题。只是我不明白这中间的原因。
第一次执行该程序总是能得到预期结果,第二次执行时,似乎第一次的数据变保存在了变量中,会影响第二次的执行

论坛徽章:
0
3 [报告]
发表于 2005-11-22 14:25 |显示全部楼层
实际上这和这个结果是怎么输出应该没有关系,而这个变量本身的值出了问题,我们用函数直接把变量写在一个本地调试文件上,结果也是一样的。
我们安装的是ActivePerl-5.8.4.810-MSWin32-x86.msi
和Apache2.0.52
应该是你说的mod_perl吧,这之间关系我也不是太懂的

论坛徽章:
0
4 [报告]
发表于 2005-11-22 14:27 |显示全部楼层
问一下大家平时是怎么定义一个全局变量的?
我看了不少perl的文章对local our my解释都有,但没说local our这个算是怎么回事

论坛徽章:
0
5 [报告]
发表于 2005-11-22 14:51 |显示全部楼层
我觉得版主可能理解有误,我说的这个例子完全可以说明了,当然我还是写了一段程序,
在浏览器输入http://127.0.0.1/perl/test1.pl
就可以执行这个文件了,当然显示的是空白页,
但查看c:\testvar.txt 就知道程序是被执行了,然后我刷新该空白页,就能重现我这个问题了

###########
test1.pl
###########
#!/usr/bin/perl -w

use strict;

our $abc;
writelog($abc);
$abc=2;
writelog($abc);


sub writelog
{
    open(aFILE, ">>c:\testvar.txt");
    print aFILE"################################################################";
    print aFILE"n";
    foreach (@_)
    {
        print aFILE ;
        print aFILE"n";
    }
     
    close aFILE;
}

###########

论坛徽章:
0
6 [报告]
发表于 2005-11-22 15:01 |显示全部楼层
晕啊,是我问你啊,还是你问我啊?
我用这种方法执行也是对的,但通过浏览器apache访问就不一样了,
所以我在怀疑应该是这之间出的问题

论坛徽章:
0
7 [报告]
发表于 2005-11-22 17:46 |显示全部楼层
原帖由 af80 于 2005-11-22 15:23 发表
这个问题讲起来挺多话的,因为在mod_perl下,你的程序陷入了所谓的closure。
等兰花仙子有空跟你讲吧。


看来大致的原因并非是perl本身的问题,要等花仙子姐姐有空来讲了。
谢谢大家的热心!!

版主这儿能不能发一些技术无关的贴子?我想问一下大家在国内用perl的都拿来干什么的啊。

对了还有这贴子里特殊字符,这算是论坛的BUG吧,得不得修修啊?
特别是咱们老贴程序代码。有不少特殊字符都不能正常显示

[ 本帖最后由 neil_young 于 2005-11-22 17:48 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2005-11-23 10:38 |显示全部楼层
实在是万分感谢 兰花仙子(应该是姐姐吧?)   
还有orangetouch 大侠,讲解得实在是非常仔细清楚!!
感动中

令小生恍然大悟,茅塞顿开!!
不过就是orangetouch 大侠程序中的反斜杠都没有显示啊,大家觉得论坛应该改进一下吗

[ 本帖最后由 neil_young 于 2005-11-23 11:08 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP