从一个文件中跳过以##开头的行后读取两个文件

时间:2018-01-11 20:40:30

标签: perl

我希望在从一个文件中跳过以##开头的行后,同时读取两个文件。

file1.txt:
##
##
##
header1 header2

file2.txt:
header3 header4

有没有办法跳过##然后同时读取两个文件中的行?

open IN1, "file1.txt";
open IN2, "file2.txt";

if <IN1> ^## skip
while(my $one = <IN1>, my $two = <IN2>){
    print "$one\t$two";

}

Outputs:
header1 header2    header1 header2

2 个答案:

答案 0 :(得分:1)

在循环中,跳过file1的行直到它们有效,并在完成其中一个文件时last输出:

open my $file1, "<", "file1.txt" or die $!;
open my $file2, "<", "file2.txt" or die $!;

while (1) {
    my $file1_line = <$file1> or next;
    next if $file1_line =~ /^##/;  # skip commented lines in file1

    my $file2_line = <$file2> or next;

    last if not ($file1_line and $file2_line);

    chomp $file1_line;
    chomp $file2_line;

    print "$file1_line\t$file2_line\n";
}

close $file1;
close $file2;

输出:

$ cat file1.txt
##
##
##
header1 header2

$ cat file2.txt 
header3 header4

$ perl mysolution.pl
header1 header2 header3 header4

$ 

答案 1 :(得分:1)

浏览每个文件,直至到达其标记,然后继续以新循环方式阅读它们

while

在两个$fh1循环之后,文件句柄$fh2print $_ while <$fh>;被定位,以便读取刚刚读取的标记行之后的下一行,每行都是其文件。

然后你继续在另一个循环中读取它们。一旦其中一个文件读取了最后一行,由foreach sink检查,该循环退出(如果下一次读取将是文件结束,则返回1)。然后,如果您需要进一步打印该文件,则可以再次测试文件句柄以查看哪些文件仍然可以读取。或者再次打印eof,这对于耗尽的文件句柄没有任何作用。

请注意,我们很少需要model,这是罕见的情况,它只是正确的工具。

标记也可以用作命令行选项。这确实围绕一些未指明的问题细节做了一些简单的假设,从问题中推断出来。