以下代码读取包含多行的文件。该文件的某些行包含四个元素。其他行仅包含第一个元素,后跟由制表符分隔的单个空格(它是制表符分隔的文件)。也就是说,有些行是“满的”,有些是“空白的”。
这个脚本的重点是读取数据文件,找到一个空行的实例,然后记住前一行(整行),滚动查找所有连续的空行,直到到达下一个整行。这组行,连续的空白行,其两侧是紧接在前面的完整行和紧接在后面的完整行,将由将应用线性插值以“填充”空白行的子程序使用。每组两侧的实线中的信息将用于插值步骤。该脚本是对先前发布的问题的回答,由用户 @Kenosis 提供。它在这里被复制了,但它的布局有一些非常小的变化——不像@Kenosis 最初提议的那样整洁。您可以在Perl中看到这种交互。使用直到函数
#!/usr/bin/perl
use strict; use warnings;
die "usage: [ map positions file post SAS ]\n\n" unless @ARGV == 1;
my $mapfile = $ARGV[ 0 ];
open( my $FILE, "<$mapfile" );
my @file = <$FILE>;
for ( my $i = 1 ; $i < $#file ; $i++ ) # $#file returns the index of the last element in @file
{
if ( $file[$i] =~ /(?:\t\s){3}/ ) # if a blank line is found
{
print $file[ $i - 1 ]; # print preceding line
while ( $file[$i] =~ /(?:\t\s){3}/ and $i < $#file ) # keep printing so long as they are blank
# or end of file
{
#print $file[ $i++ ] # one-column, blank line
}
print $file[ $i ]; # print the succeeding full line
} # if
} # for
当我尝试插入修改时,问题就来了。
my @collect = (); # array collects a current set of consecutive lines needed for linear interpolation
my @file = <$FILE>;
for ( my $i = 1 ; $i < $#file ; $i++ ) # $#file returns the index of the last element in @file
{
if ( $file[$i] =~ /(?:\t\s){3}/ ) # if a blank line is found
{
print $file[ $i - 1 ]; # print preceding line
push( @collect, $file[ $i - 1 ] );
while ( $file[$i] =~ /(?:\t\s){3}/ and $i < $#file ) # keep printing so long as they are blank
# or end of file
{
#print $file[ $i++ ]; # one-column, blank line
push( @collect, $file[ $i++ ] )
}
print $file[ $i ]; # else, succeeding full line
push( @collect, $file[ $i ] );
} # if
} # for
罪魁祸首在while循环中。在此处添加push
命令会更改脚本的行为。该脚本不再像上面的第一个脚本那样打印所有行。为什么添加该命令会改变脚本的工作方式?