-1

以下代码读取包含多行的文件。该文件的某些行包含四个元素。其他行仅包含第一个元素,后跟由制表符分隔的单个空格(它是制表符分隔的文件)。也就是说,有些行是“满的”,有些是“空白的”。

这个脚本的重点是读取数据文件,找到一个空行的实例,然后记住前一行(整行),滚动查找所有连续的空行,直到到达下一个整行。这组行,连续的空白行,其两侧是紧接在前面的完整行和紧接在后面的完整行,将由将应用线性插值以“填充”空白行的子程序使用。每组两侧的实线中的信息将用于插值步骤。该脚本是对先前发布的问题的回答,由用户 @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命令会更改脚本的行为。该脚本不再像上面的第一个脚本那样打印所有行。为什么添加该命令会改变脚本的工作方式?

4

2 回答 2

2

你想在那条push线上做什么?

它包括表达式$i++,它将 的值加 1 $1,因此该循环的每次迭代while都将跳转到文件中的另一行。

你的意思是$i + 1

于 2013-01-10T12:17:50.543 回答
1

您是否真的添加了第二行递增的代码$i$i += 1不一样$i += 2

于 2013-01-10T12:17:50.853 回答