使用范围动态打印数组元素

时间:2014-10-22 10:36:23

标签: arrays perl perl-data-structures

我有以下代码:

  #!/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:我的问题在于显示数组范围。请不要讨论该计划的效率。

2 个答案:

答案 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个线)