2014-04-16 34 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

相關問題