在perl中正确使用输入文件?

时间:2014-01-22 05:36:14

标签: perl input while-loop

database.Win.txt是一个包含3行多个的文件。每三行中的第二行是一个数字。代码应该打印出一行由制表符分隔的三行(按新顺序),但仅限于第二行是1.

通过这段代码,我是否真的得到循环来创建一个包含三行database.Win.txt的数组,每次它都在循环中运行?这是我的目标,但我怀疑这不是代码所做的,因为我得到一个错误,说int()函数需要一个数值,但没有找到一个。

while(<database.Win.txt>){
    $new_entry[0] = <database.Win.txt>;
    $new_entry[1] = <database.Win.txt>;
    $new_entry[2] = <database.Win.txt>;
    if(int($new_entry[1]) == 1) {
        chomp($new_entry);
        print "$new_entry[1], \t $new_entry[2], \t $new_entry[0], \n"
    } 
}

我是Perl的初学者。请尽可能简单解释!

1 个答案:

答案 0 :(得分:0)

我认为你在解决方案上有一个良好的开端。但是,您的while会在读取下三行之前读取一行(如果这些是<$file_handles>)。 int不是必需的,chomp是 - 在检查$new_entry[1]的值之前,最后还有一个记录分隔符。

鉴于此,请考虑以下事项:

use strict;
use warnings;

my @entries;
open my $fh, '<', 'database.Win.txt' or die $!;

while (1) {
    last if eof $fh;
    chomp( $entries[$_] = <$fh> ) for 0 .. 2;

    if ( $entries[1] == 1 ) {
        print +( join "\t", @entries ), "\n";
    }
}

close $fh;

始终以use strict; use warnings开头。接下来,使用open的{​​{3}}打开文件。这里使用while (1),因此可以在while循环内一次读取三行。由于它是一个'无限'while循环,last if eof $fh;提供了一条出路,即,如果下一个文件读取产生文件结尾,那就是last。正下方是一个for循环,它可以有效地完成您的操作:将文件行分配给数组位置。请注意,chomp用于在分配期间删除记录分隔符。最后一部分也与你的相似,因为它检查三行中的第二行是否为1,然后如果是则打印该行。

希望这有帮助!