所以我对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;
答案 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;