如何防止循环中元素被修改

如何防止循环中元素被修改

在循环中如何来防止数组中的元素被修改
如id文件为:
   3608,7754321
    12345,343608
oldgrp文件为:
   apache:12345
代码1 循环时,会发生
   apache:343608
    apache:347754321  (这一行是多出来的) 是由于循环数组的数据被修改了,又参与了循环
代码2 偶增加了临时变量,结果是正确的。

对于什么时候会修改循环原数据,我不是很明白。请高人指点下。

代码1:
#!/usr/bin/perl


use File::Basename;
open(SRCFILE,"<oldgrp");
open(IDFILE,"<id");
@idarr=<IDFILE>;

while( $grpline=<SRCFILE>){

    foreach $each(@idarr)
    {
      chomp $each;
      ($sid,$nid)=split /,/,$each;
     
      if($grpline =~ /$sid/)
      {
        $grpline=~ s/$sid/$nid/;
         print "$grpline";
      }
    }
}



代码2:
#!/usr/bin/perl


use File::Basename;
open(SRCFILE,"<oldgrp");
open(IDFILE,"<id");
@idarr=<IDFILE>;

while( $grpline=<SRCFILE>){
        
   foreach $each(@idarr)
   {
     chomp $each;
     ($sid,$nid)=split /,/,$each;
     
     my $gline=$grpline;
     if($gline =~ /$sid/)
     {
       #print "$grpline\n";

       $gline=~ s/$sid/$nid/;
       print $gline;
     }
   }
}
乱得一塌糊涂.

1.
对代码1:
补上use strict;
补上use warnings;
补上my, 运行结果只有一行:
apache:343608


2.
@idarr=<IDFILE>;
在这里就chomp @idarr;  多好, 何必每次循环都去搞.

3.
if($grpline =~ /$sid/)
      {
        $grpline=~ s/$sid/$nid/;
         print "$grpline";
     }
为什么不写成
if($grpline=~ s/$sid/$nid/;)
      {
         print "$grpline";
     }
1.
对代码1:
补上my, 运行结果只有一行:
apache:343608

这my加在哪里(我测试都是一样)?     示例不做任何修改,只有几个记录时不会出现我所说的情况(也是apache:343608这个结果),当处理1000多条记录时就会出现。
每使用一个新变量, 定义的地方就用my

缩小下出问题的数据范围吧, 用二分法.
如果没法缩小范围, 把2个文件当做附件贴上来.
如果没法贴上来, mail给我.
我用代码2可以解决,不会出现这种情况,是正确的。代码2使用了临时变量。
    foreach $each(@idarr)
    {
      chomp $each;
      ($sid,$nid)=split /,/,$each;
     
      if($grpline =~ /$sid/)
      {
        $grpline=~ s/$sid/$nid/;
         print "-1-";
         print "$grpline";
         print "-2-\n";
         $grpline= "0";
         
      }


id文件:
12345,343608
3608,7754321
grp文件:
apache:12345

输出,
apache:343608
apache:347754321

测试的时候发现,问题是出现在foreach 循环中,当$grpline被修改后,又在foreach 中循环,如果后面加一个$grpline="0" 类似置空,就可以。



[Copy to clipboard] [ - ]
CODE:
if($grpline=~ s/$sid/$nid/;)
      {
         print "$grpline";
     }

提示语法不对哦, 就是;这里 。纠正一下,这个; 是多余的。

原来你是这个意思... 偶没话说

建议把标题改一下吧