将文件行存储到数组中

时间:2016-02-27 22:35:28

标签: arrays perl file lines

所以我对Perl很新,只学习了一周。我试图只将特定范围的行读入数组。如果我在if语句中打印$ _,它会准确列出我想要存储到我的数组中的内容。但是将$ _存储到我的数组中然后在while之外打印@array什么也没有显示。我不知道该怎么做。我试图将其存储到数组中的原因也是从列中获取某些信息,因此需要一个数组来执行此操作。谢谢你的帮助。它对你们来说可能很简单

use strict;
use warnings;

my $filename = 'info.text';
open my $info, $filename or die "Could not open $filename: $!";
my $first_line = 2;
my $last_line = 15;

open(FILE, $filename) or die "Could not read from $filename, program halting.";

my $count = 1;
my @lines;

while(<FILE>){
    if($count > $last_line){
        close FILE;
        exit;
    }
    if($count >= $first_line){
        #print $_;
        push @lines, $_;
    }
    $count++;
}
print @lines;

3 个答案:

答案 0 :(得分:2)

在数字上做得更简单:

my @lines = (<FILE>)[1..14];

(注意 - perl数组从零开始 - 上面的“第一行”为0

但你可以选择保留你正在做的事情,并测试$.

while ( my $line = <FILE> ) {
    chomp; 
    next unless $. > 2; 
    push ( @lines, $line ); 
    last if $. > 15; 
}

哪个应该做同样的事情。

答案 1 :(得分:0)

Perl实际上有一个变量$.,它表示最近使用的File句柄中的当前行:

来自perldoc -v $.

  

HANDLE-&gt; input_line_number(EXPR)

     

$ INPUT_LINE_NUMBER

     

$ NR

     

$

     

访问的最后一个文件句柄的当前行号。

     

Perl中的每个文件句柄都计算已读取的行数   从中。 (根据$ /的值,Perl的想法是什么   构成一条线可能与你的不匹配。)从a中读取一条线   filehandle(通过readline()或&lt;&gt;),或者调用tell()或seek()时   在它上面,$。成为该文件句柄的行计数器的别名。

您可以使用此变量大幅简化代码:

use strict;
use warnings;

my $filename = 'info.text';
open(FILE, $filename) 
   or die "Could not read from $filename, program halting.";

my @lines;
while(<FILE>){
    next unless $. >= 2 && $. <= 15;
    push @lines, $_;
}
close FILE;
print @lines;

您可以将此代码或修改后的版本包装在接受文件句柄,起始行和结束行的子例程中,以使其更加灵活。

与您手头的问题无关的另一个注意事项,建议您always use three argument open

答案 2 :(得分:0)

您的代码实际上没有什么问题。它不起作用的唯一原因是你在找到范围的最后一行时调用exit。这意味着程序立即停止,从不执行print @lines语句

你也没有明显的原因打开输入文件两次,但这不会导致任何问题

这是我写它的方式。请注意,我已经使用了autodie pragma,因此我不需要为任何IO操作显式编写错误处理程序

use strict;
use warnings;
use v5.14.1;
use autodie;

use constant FILE       => 'info.text';
use constant FIRST_LINE => 2;
use constant LAST_LINE  => 15;

open my $fh, '<', FILE;

my @lines;

while ( <$fh> ) {
    push @lines, $_ if FIRST_LINE .. LAST_LINE;
    last if $. == LAST_LINE;
}

print @lines;