在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