在perl中,讀取文件最簡單的方法是,每次讀取4行文件?從文件中讀取多行(作爲滑動窗口)的最簡單方法
如果文件中包含像
bye
how
are
you
car
bed
dog
隨機的話,我想讀取大小爲4的滑動窗口中的文件,所以我想讀入一個字符串
bye how are you
how are you car
are you car bed
you car bed dog
在perl中,讀取文件最簡單的方法是,每次讀取4行文件?從文件中讀取多行(作爲滑動窗口)的最簡單方法
如果文件中包含像
bye
how
are
you
car
bed
dog
隨機的話,我想讀取大小爲4的滑動窗口中的文件,所以我想讀入一個字符串
bye how are you
how are you car
are you car bed
you car bed dog
這是另一個例子。每行都被壓入數組@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
創建一個緩衝區,然後逐行處理;
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;
}
負載的話到一個數組,然後可以循環與push
和shift
陣列,並打印一個數組切片:
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
謝謝。這個版本更容易理解。 – bubbles
是的,很好的邏輯。而不是麻煩做另一個'> 4'測試,在'if'結尾處做一個盲目的'shift'比較容易。 +1無論如何 – Miller
@Miller:我同意。我改變了它 – Borodin