perl在读取文件时嵌套

时间:2012-07-13 15:40:59

标签: perl loops while-loop filehandle

我想比较两个文件,所以我编写了以下代码:

while($line1 = <FH1>){
     while($line2 = <FH2>){
         next if $line1 > $line2;
         last if $line1 < $line2;
     }
     next;
}

我的问题是,当外部循环到达file1的下一行然后进入内部循环时,内部while语句将再次从file2的第一行读取,还是继续在上一次迭代中停止的位置外环?

由于

3 个答案:

答案 0 :(得分:7)

您应该在所有程序的开头总是 use strictuse warnings,并在首次使用时声明所有变量。这尤其适用于您在寻求代码帮助时。

文件中的所有数据都是数字的吗?如果没有,则启用警告会告诉您<>运算符用于比较数值而不是一般字符串。

完全读完文件后 - 即第二个循环的while条件终止 - 除非您open再次使用seek或使用{{1}},否则您无法再读取该文件中的数据倒回到开头。

通常,在这些情况下,最好将两个较小的文件读入一个数组并使用那里的数据。如果两个文件都非常大,那么必须要做一些特别的事情。

您尝试进行哪种文件比较?您确定两个文件是否相同,或者第二个文件中的所有数据都显示在第一个文件中,还是其他内容?请举例说明您的两个数据文件,以便我们为您提供更好的帮助。

答案 1 :(得分:2)

当您从while句柄读取第一行时,内部FH2循环将使用FH1文件句柄的所有内容。如果我能想知道你想要完成什么,那么一种方法就是从同一语句中的两个句柄中读取:

while ( defined($line1 = <FH1>) && defined($line2 = <FH2>) ) {
    # 'lt' is for string comparison, '<' is for numbers
    if ($line1 lt $line2) {
        # print a warning?
        last;
    }
}

答案 2 :(得分:0)

内部循环将从它在FH2中的最后一个已知位置继续 - 如果您希望它从您需要放置的文件的开头重新启动:

seek(FH2, SEEK_SET, 0);

在内在之前

在perldoc中,搜索的文档是here