0

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

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

我的问题是,当外部循环到达 file1 的下一行然后进入内部循环时,内部 while 语句是否会再次从 file2 的第一行读取,或者在外部循环的上一次迭代中继续它离开的地方环形?

谢谢

4

3 回答 3

7

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

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

一旦一个文件被完全读完——即第二个循环的while条件终止——你就不能从文件中读取更多的数据,除非你open再次读取它或使用它seek倒回到开头。

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

您要进行哪种文件比较?您是否确保这两个文件相同,或者第二个文件中的所有数据都出现在第一个文件中,或者其他什么?请举例说明您的两个数据文件,以便我们更好地帮助您。

于 2012-07-13T15:55:53.990 回答
2

当您从句柄读取第一行时,内部while循环将消耗文件句柄的所有内容。如果我能直觉你想要完成什么,一种方法是从同一语句中的两个句柄中读取:FH2FH1

while ( defined($line1 = <FH1>) && defined($line2 = <FH2>) ) {
    # 'lt' is for string comparison, '<' is for numbers
    if ($line1 lt $line2) {
        # print a warning?
        last;
    }
}
于 2012-07-13T16:57:22.310 回答
0

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

seek(FH2, SEEK_SET, 0);

在内部之前

搜索文档perldoc 中

于 2012-07-13T15:55:45.663 回答