免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5945 | 回复: 7

必须要将全局变量定义在子函数的前面? [复制链接]

论坛徽章:
0
发表于 2012-03-21 12:17 |显示全部楼层
本帖最后由 yahoon 于 2012-03-21 12:20 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub sum_of_2_items {
  5.         print "you are calling subrouting sum_of_2_items.\n";
  6.         return $a+$b;
  7. }

  8. my $a=15;
  9. my $b=13;
  10. my $sum=&sum_of_2_items;
  11. print "here is the sum $sum\n";
  12. print "here is the product sumx3=",(&sum_of_2_items)*3;
复制代码
输出如下
Name "main::a" used only once: possible typo at exsubadd.pl line 8.
Name "main::b" used only once: possible typo at exsubadd.pl line 8.
you are calling subrouting sum_of_2_items.
Use of uninitialized value in addition (+) at exsubadd.pl line 8.
Use of uninitialized value in addition (+) at exsubadd.pl line 8.
here is the sum 0
you are calling subrouting sum_of_2_items.
Use of uninitialized value in addition (+) at exsubadd.pl line 8.
Use of uninitialized value in addition (+) at exsubadd.pl line 8.
here is the product sumx3=0

难道必须要将全局变量定义在子函数的前面??
奇怪的是 我如果用
$a=15;
$b=13;
位置不变,就不报错了,但是这样不是违反了use strict的必须先使用my定义变量规则吗??

谁给解释一下哈,thanks

论坛徽章:
0
发表于 2012-03-21 13:15 |显示全部楼层
你使用的是私有变量my,使用全局变量our
  1. our $a=15;

  2. our $b=13;

复制代码

论坛徽章:
0
发表于 2012-03-21 13:36 |显示全部楼层
  1. sub sum_of_2items {
  2.         my ($x,$y) = @_;
  3.         print "you are calling subrouting sum_of_2items.\n";
  4.         $x+$y;
  5. }

  6. my $sum = sum_of_2items(1,2);
复制代码
1.传参进子函数;
2.避免使用$a $b作为变量名,它们是内置变量。

论坛徽章:
0
发表于 2012-03-21 13:48 |显示全部楼层
回复 3# 兰花仙子

如果我想在子函数里面改变全局变量(my $x=15; my $y=13)的值是不是要用our而不能用my?
从我测试的结果看
什么操作符(my,our等)也不加也可以起到全局变量的效果


   

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
发表于 2012-03-21 14:44 |显示全部楼层
本帖最后由 ttcn_cu 于 2012-03-21 14:45 编辑

见flw 05年的帖子 (回到主题列表看本版精华区,第二个)
http://bbs.chinaunix.net/thread-556778-1-1.html

论坛徽章:
0
发表于 2012-03-21 15:12 |显示全部楼层
本帖最后由 yahoon 于 2012-03-21 15:16 编辑

回复 5# ttcn_cu

非常感谢, 我的理解是
my是闭合块里面的私有变量,作用域是从my定义开始到闭合块结束
而our是包全局变量,一旦定义(无论定义是在包的任何地方),都是全局有效的

如果没有my或者our开头,则认为它是全局变量

而当use strict时,必须先用our或者my来声明变量才可使用.
在我之前的例子里, 因为$a,$b是内部变量,所以不用声明也可以使用

我用的5.8.8 看来是这样



   

论坛徽章:
0
发表于 2012-03-21 15:36 |显示全部楼层
按照仙子指示
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub sum_of_2_items
  5. {
  6.                 my ($x,$y) = @_;
  7.         print "you are calling subrouting sum_of_2_items.\n";
  8.         return $x+$y;
  9. }
  10. my $a=15;
  11. my $b=13;
  12. my $sum=&sum_of_2_items($a,$b);
  13. print "here is the sum $sum\n";
  14. print "here is the product sumx3=",(&sum_of_2_items($a,$b))*3;
复制代码

论坛徽章:
0
发表于 2012-03-21 15:36 |显示全部楼层
输出:
  1. you are calling subrouting sum_of_2_items.
  2. here is the sum 28
  3. you are calling subrouting sum_of_2_items.
  4. here is the product sumx3=84
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP