2014-04-16 28 views

回答

3

这是另一个例子。每行都被压入数组@window,如果这导致数组中包含四个元素,则会打印数组,并使用shift从头开始移除最老的元素。

use strict; 
use warnings; 

my @window; 

while (<DATA>) { 
    chomp; 
    push @window, $_; 
    if (@window == 4) { 
    print "@window\n"; 
    shift @window; 
    } 
} 

__DATA__ 
bye 
how 
are 
you 
car 
bed 
dog 

输出

bye how are you 
how are you car 
are you car bed 
you car bed dog 
+0

谢谢。这个版本更容易理解。 – bubbles

+0

是的,很好的逻辑。而不是麻烦做另一个'> 4'测试,在'if'结尾处做一个盲目的'shift'比较容易。 +1无论如何 – Miller

+0

@Miller:我同意。我改变了它 – Borodin

2

创建一个缓冲区,然后逐行处理;

use strict; 
use warnings; 

my @buffer = map {scalar <DATA>} (1..3); 

while (<DATA>) { 
    push @buffer, $_; 

    # Show Buffer on a single line 
    print join(' ', map {chomp; $_} @buffer), "\n"; 

    shift @buffer; 
} 

__DATA__ 
Line1 
Line2 
Line3 
Line4 
Line5 
Lien6 
Line7 
Line8 
Line9 

输出:

Line1 Line2 Line3 Line4 
Line2 Line3 Line4 Line5 
Line3 Line4 Line5 Lien6 
Line4 Line5 Lien6 Line7 
Line5 Lien6 Line7 Line8 
Lien6 Line7 Line8 Line9 

更新

要主动删除线的结局,只是做到以下几点。输出将是与上述相同:

my @buffer = map {$_ = <DATA>; chomp; $_} (1..3); 

while (<DATA>) { 
    chomp; 
    push @buffer, $_; 

    # Show Buffer 
    print "@buffer\n"; 

    shift @buffer; 
} 
+0

理想我想他们存储在像“线路1线路2行3线路4串。有没有更简单的方法呢?究竟是什么地图和格格那么我会解析一个非常大的文件,所以性能是关键 – bubbles

+0

'map'和'chomp'只是从缓冲区中删除行结束符,所以我可以将它们打印出来,这将很容易包含' chomp'作为默认处理的一部分,但是你没有指定你想要的行的格式。 – Miller

+0

而不是将它存储在一个数组中,然后加入以创建字符串,如何将其存储在字符串中?我对perl非常陌生,我刚刚发现严格使用并使用了很大程度上帮助我的代码的警告 – bubbles

0

负载的话到一个数组,然后可以循环与pushshift阵列,并打印一个数组切片:

use strict; 
use warnings; 

chomp(my @words = <DATA>); 

for (1 .. 4) { 
    print "@words[0..3]\n"; 
    push @words, shift @words; 
} 


__DATA__ 
bye 
how 
are 
you 
car 
bed 
dog 

输出:

how are you car 
are you car bed 
you car bed dog 
car bed dog bye 
+0

如果我想用一个字符串存储以下格式“word1 word2 word3 word4” – bubbles

+0

,那么该文件也会被硬编码。如果我想让我的文件在n行上包含n个单词,该怎么办? – bubbles

+0

1)'“@words [0..3] \ n”'*是一个字符串。 2)您可以更改变量的数字。不太清楚你在说什么。这是示例代码,您可以根据自己的需要更改它。 – TLP

相关问题