Chinaunix

标题: 关于一个局部变量和全局变量的问题!崩溃。。。 [打印本页]

作者: hotren    时间: 2008-01-11 09:07
标题: 关于一个局部变量和全局变量的问题!崩溃。。。
写了一个程序和子程序,部分如下:
主程中引用如下:

&MRTG_Config($max_rate,$link_desc,$ip_address,$if_index,$community,'traffic');

&MRTG_Config($max_rate,$link_desc,$ip_address,$if_index,$community,'uncast');

&MRTG_Config($max_rate,$link_desc,$ip_address,$if_index,$community,'multicast');

&MRTG_Config($max_rate,$link_desc,$ip_address,$if_index,$community,'broadcast');

子程序如下:
sub MRTG_Config {
    my ($max_rate,$link_desc,$ip_address,$if_index,$community,$type)=@_;
    my $traffic='bit';
    my $uncast=$multicast=$broadcast='packets';
    print "type is $type,traffic is $traffic,result is ${$type}\n";
}

结果如下:
type is traffic,traffic is bit,result is
type is uncast,traffic is bit,result is
type is multicast,traffic is bit,result is packets
type is broadcast,traffic is bit,result is packets


问题:
为什么第一、二行结果不能正常打印$traffic和$uncast???  我把子程序中的$traffic及$uncast等的定义改成全局变量(去掉前面的my)结果就正常了,我的感觉是子程序在打印时,对于$traffic及$uncast均调用的全局变量,而$multicast及$broadcast则正常调用了我定义的局部变量(我在主程中从未重复使用过这些变量名)。

请高手帮忙解答一下,谢谢。
作者: hotren    时间: 2008-01-11 09:37
DDDDDDDDDDDDDDDDDDDDDDDDDDDD
作者: perljoker    时间: 2008-01-11 09:50

传说中的符号引用?

任何程序,建议加上use strict; use warnings;
在不必要的情况下不使用符号引用

my $uncast=$multicast=$broadcast='packets';

上面这句话就是有问题的,表示,你申明了$uncast为my变量,而其他2个仍然是全局变量,所以出现不同
my申明多个应该是 my($aa,$bb,$cc,$dd)=(0,0,0,0);这样子的

为何不用hash呢?my %tmp; print $tmp{$type};
作者: hotren    时间: 2008-01-11 14:13
好,谢谢,我先试试。。。。

[ 本帖最后由 hotren 于 2008-1-11 14:17 编辑 ]
作者: hotren    时间: 2008-01-11 14:25
看来用${$type}的这种形式果然不行,不过不知道为什么?按理说如果$type='traffic'的话,${$type}应该和$traffic是等价的呀?不太明白为什么程序引用${$type}时只引用同名的全局变量,而不引用局部变量?!

谢谢,准备改用散列了,不过还是想知道以上的原因,哪位知道不妨告诉一下,谢谢!
作者: perljoker    时间: 2008-01-11 14:56
use strict的时候,是不能用符号引用的
符号引用可以引用全局变量,对于my的,我就不知道了,因为我向来use strict; 不用符号引用……




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2