免费注册 查看新帖 |

Chinaunix

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

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 13:47 |只看该作者

回复 1楼 neil_young 的帖子

用local试一下,local是包函子程序内都有效的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2005-11-22 13:58 |只看该作者
本来很想帮你。可是怀疑你展现出来的和真实的不同。

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2005-11-22 14:14 |只看该作者
你的是 CGI 还是 mod_perl?
“每次”是指浏览器每次请求吗?
按道理来讲,浏览器请求两次得到的应该是相同的呀!

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

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2005-11-22 14:31 |只看该作者
这样,你最好写一个简单的小程序,可以复显你的现象。
不然不好帮你。

local our 和 local 是一个效果。

论坛徽章:
0
9 [报告]
发表于 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;
}

###########

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2005-11-22 14:58 |只看该作者
为什么我这里就是对的呢?
  1. D:\MoChou>del c:\testvar.txt

  2. D:\MoChou>cat ttt.pl
  3. use strict;

  4. our $abc;
  5. writelog($abc);
  6. $abc=2;
  7. writelog($abc);


  8. sub writelog
  9. {
  10.     open( aFILE, '>>c:\testvar.txt' );
  11.     print aFILE "-----\n";
  12.     foreach (@_)
  13.     {
  14.         print aFILE;
  15.         print aFILE "\n";
  16.     }

  17.     close aFILE;
  18. }

  19. D:\MoChou>ttt

  20. D:\MoChou>cat c:\testvar.txt
  21. -----

  22. -----
  23. 2

  24. D:\MoChou>ttt

  25. D:\MoChou>cat c:\testvar.txt
  26. -----

  27. -----
  28. 2
  29. -----

  30. -----
  31. 2

  32. D:\MoChou>ttt

  33. D:\MoChou>cat c:\testvar.txt
  34. -----

  35. -----
  36. 2
  37. -----

  38. -----
  39. 2
  40. -----

  41. -----
  42. 2

  43. D:\MoChou>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP