免费注册 查看新帖 |

Chinaunix

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

为什么我从管道读数据了原来的数组值就变了啊? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-20 15:30 |只看该作者 |倒序浏览
use strict;
use warnings;
use Getopt::Long;         
my @node = ();
my $nodegroup = "";
my $dir = "/opt/OV/bin/OpC/utils/opcnode";
my $list_Nodes =$dir." "."-list_nodes";
my $list_AssNodes = $dir." "."-list_ass_nodes"." group_name=".$nodegroup;
my %list_AssTempls =();
my %nettype = ();       

GetOptions("n|node=s"=>\@node,"ng|nodegroup=s"=>\$nodegroup);

######################################################################
#Get all nodes' nettype  and the  command that is used to get a node's assigned templates
######################################################################
open(P1,"$list_Nodes|") or die "Can't run the command: $!";
foreach (@node)
{
        my $flag = 0;
        my $node = $_;                                       
        while(<P1>)
        {       
                $flag = 1 if(/$node/i);
                if($flag && /Network\sType\s+=\s(\w+)/)
                {
                        $nettype{$node}=$1;
                        last;       
                }
        }
        $list_AssTempls{$node}=$dir." "."-list_ass_templs"." nodename=".$node." nettype=".$nettype{$node};
}
close P1;


比如命令为perl 1.pl -n aaa -ng group
问题就在while(<P1>)这里,在while上一句,print "@node";时,@node都还是aaa,但是进入while循环后@node就变成管道读入的数据了,并且,当我在$nettype{$node}=$1;上一句打印@node的值的时候,@node居然变成了Network Type = NETWORK了,我觉得很奇怪额,@node不是等于参数aaa吗,怎么后面就变了呢

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-07-20 15:46 |只看该作者
原帖由 frilland 于 2009-7-20 15:30 发表
foreach (@node)
{
        my $flag = 0;
        my $node = $_;                                       
        while(<P1>)
        {      

用 foreach my $node (@node) { ... 这种写法吧

论坛徽章:
0
3 [报告]
发表于 2009-07-20 16:07 |只看该作者

回复 #2 MMMIX 的帖子

呵呵,真的就可以了呢~谢谢你哈~!!!!

论坛徽章:
0
4 [报告]
发表于 2009-07-20 16:23 |只看该作者

回复 #1 frilland 的帖子

我学习perl不长时间,能否说明一下你的这个程序实现的功能是什么?我看不太懂~~谢谢了~~

论坛徽章:
0
5 [报告]
发表于 2009-07-21 08:14 |只看该作者

回复 #2 MMMIX 的帖子

为啥了?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2009-07-21 08:17 |只看该作者
原帖由 Perl_Er 于 2009-7-21 08:14 发表
为啥了?

自己在 perlsyn 中查查。

论坛徽章:
0
7 [报告]
发表于 2009-07-21 11:06 |只看该作者
细微差别,大家注意啦!
while (<FILE>) { … }

    tramples on $_ while foreach does not (foreach localises $_ first). Surely this is the most important behavioural difference!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2009-07-21 13:06 |只看该作者
原帖由 Perl_Er 于 2009-7-21 11:06 发表
细微差别,大家注意啦!
while () { … }

    tramples on $_ while foreach does not (foreach localises $_ first). Surely this is the most important behavioural difference!

这个虽然没错,但和楼主的问题没有太大关系。

楼主的问题是,在 foreach (@node) BLOCK 这种写法中,@node 的值在 BLOCK 中被修改,这显然是由于这种写法导致在 BLOCK 中,$_ 是 @node 成员的别名,修改 $_ 就会修改 @node 对应的元素。foreach my $node (@node) BLOCK 这种写法,刚好可以用来解决这个问题。

BTW, 你这种给了正确答案却偏偏能再找个错误答案的能力实在让我无语

论坛徽章:
0
9 [报告]
发表于 2009-07-21 13:21 |只看该作者
在解决问题的同时,能引申出一些值得注意的地方,你的回答让人知其然,而不知其所以然. 明白while(<FH>,对这个问题很重要.这也是为什么我那样回复的原因。
foreach (@node) BLOCK 这种写法中会使用到$_变量,并且会localises $_ first. 而while(<FH>没有localises $_变量,而直接更改了上面foreach的$_,所以@node变了.如果把他的while改为foreach的话也是可行的. 并不是完全那个foreach写法有问题。
不要只是为了解决问题而解决问题!

[ 本帖最后由 Perl_Er 于 2009-7-21 16:47 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP