我希望在从一个文件中跳过以##开头的行后,同时读取两个文件。
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
答案 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
循环之后,文件句柄$fh2
和print $_ while <$fh>;
被定位,以便读取刚刚读取的标记行之后的下一行,每行都是其文件。
然后你继续在另一个循环中读取它们。一旦其中一个文件读取了最后一行,由foreach
sink检查,该循环退出(如果下一次读取将是文件结束,则返回1)。然后,如果您需要进一步打印该文件,则可以再次测试文件句柄以查看哪些文件仍然可以读取。或者再次打印eof
,这对于耗尽的文件句柄没有任何作用。
请注意,我们很少需要model
,这是罕见的情况,它只是正确的工具。
标记也可以用作命令行选项。这确实围绕一些未指明的问题细节做了一些简单的假设,从问题中推断出来。