我有以下代码:
#!/usr/bin/perl
open (FH, "input.txt") or die $!;
my @contents = <FH>;
my $count = 0;
map
{
$count ++;
if($_ =~ /This/)
{
print "\nNext 3 lines:\n$contents[$count+1] $contents[$count+2] $contents[$count+3]";
}
} @contents;
计划摘要: 1.获取输入文件。 2.如果该行包含&#39; This&#39;,则打印接下来的3行。
我想知道如何修改print语句以使用范围显示数组内容。 也就是说,如下所示:
print "\nNext 3 lines:\n$contents[$count..$count+3]";
任何人都可以指出实现这一目标的正确方法是什么?
PS:我的问题在于显示数组范围。请不要讨论该计划的效率。
答案 0 :(得分:3)
您需要的语法是
@contents[$count..$count+3]
它被称为数组切片。
但你可能想要这样的东西:
@contents[$count..min($count+3, $#count)]
避免从阵列末端掉落。
请不要在这样的void上下文中使用map
。如果您没有使用map
的返回值,那么foreach
(或for
)对于需要稍后维护代码的人来说就不那么容易混淆了(即使你是两个人)几周时间。
更新:在评论中,@ DaveVogt刚刚指出你的计数从1开始而不是更常见的0.最简单的方法就是移动{{1} }到循环体的末尾。
所以这就是我写它的方式(嗯,这可能不是我写它的方式 - 但它是我从你的版本开始编写它的方式)。
$count++
答案 1 :(得分:3)
#!/usr/bin/perl
use warnings;
use strict;
my @lines = ('one', 'two', 'This line', 'That line', 'Other line', 'Last line', 'three', 'four');
my $count = 0;
foreach(@lines){
$count = 4 if /This/;
print "$_\n" if ($count-- > 0);
}
在阅读您的数组时,这会在遇到$count
时将4
设置为This
,并会打印该行,直到$count -1
为&gt; 0(即第一个入射线打印线本身,然后是接下来的3个线)