困惑,求助for的嵌套循环!!!

困惑,求助for的嵌套循环!!!



QUOTE:
#!/usr/bin/perl -w
use strict;
open NN,"config.txt";
open IP,"ip.txt";
for(<IP>){
chomp (my $ip=$_);
                        for(<NN>){
                                s/yelanxin/$ip/;
                                print;
        }
}

上面是perl代码。
两个文件
#cat config.txt
yelanxin
yelanxin2
yelanxin3

#cat ip.txt
a
b
c


执行程序后外部的for只循环一次。。。不知道怎么回事?初学者求助。
结果如下:

a
a2
a3




我想要的结果是:
a
a2
a3
b
b2
b3
c
c2
c3
内部的for循环第一次执行时就已经把config.txt读完了
所以实际上是内部的for循环执行了一次,而不是外部的for循环执行了一次

你可以my @data = <NN>;
然后把
for(<NN>)
改成
for (@data)
里层的for循环执行一次后<NN>里的内容已经耗尽,也就是说NN这个文件句柄对应的文件已经读到末尾,所以以后两次外层循环到for(<NN>)这根本不会进去。

我觉得IO::File里应该有类似于rewind的函数,把文件指针重置

顺便说下,我用komodo一句句调试的,蛮好用^ ^
谢谢。


QUOTE:
原帖由 churchmice 于 2008-8-4 20:22 发表
内部的for循环第一次执行时就已经把config.txt读完了
所以实际上是内部的for循环执行了一次,而不是外部的for循环执行了一次

你可以my @data = ;
然后把
for()
改成
for (@data)

还是有问题,现在变成:
a
a2
a3
a
a2
a3
a
a2
a3


QUOTE:
#!/usr/bin/perl -w
use strict;
open NN,"config.txt";
open IP,"ip.txt";
my @data=<NN>;
my @ip=<IP>;
for(my $i=0;$i<=$#ip;$i++){
                        for(<@data>){
                                s/yelanxin/$ip[$i]/;
                                print;
        }
}

改成这样居然也不行??????

终于可以了,改成:

QUOTE:
#!/usr/bin/perl -w
use strict;
open IP,"ip.txt";
my @ip=<IP>;
for(my $i=0;$i<=$#ip;$i++){
open NN,"config.txt";
                        for(my @data=<NN>){
                                s/yelanxin/$ip[$i]/;
                                print;
        }
}

谁能解释下为什么?
原因我已经说过了
忘记说了
foreach(@data)循环里面对$_所做的变更直接影响到@data里面的内容
也就是说$_其实是@data中数据的引用
所以改成这样

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl -w
use strict;
open NN,"config.txt";
open IP,"ip.txt";
my @data = <NN>;
foreach(<IP>){
chomp (my $ip=$_);
                        for(@data){
                                my $data = $_;
                                $data =~ s/yelanxin/$ip/;
                                print $data;
        }
}

这样也是可以的
先生成@data的一个匿名拷贝,然后deference,相当于每次操作的都是@data的副本

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
open my $NN,"<","config.txt" or die "Fail to open config.txt $!";
open my $IP,"<","ip.txt" or die "Fail to open config.txt $!";
my @data =<$NN>;
while (<$IP>)  {
        chomp ( my $ip = $_ );
        print map {  s/yelanxin/$ip/;$_ } @{[@data]};
        }