在向文件添加新行时删除空行(在Perl中)

时间:2013-05-21 02:05:29

标签: perl fileupdate

当文件的每一行代表一天的数据时,我的文件中保存了每日股票价格的文件。例如:

20/05/2013  23.46   23.58   23.43   23.57   32884800    23.57
17/05/2013  23.27   23.48   23.2    23.46   41037700    23.46

我创建了一个更新程序,用于检查保存文件中的最后一个日期(最后一个日期显示在文件顶部),将其与当前日期进行比较,如果不相等则通过附加缺少的行来更新缺失的数据only(新行添加在现有文件的顶部)。

我已使用this方法追加这些行:

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

print $out "# Add this line to the top\n";

while( <$in> )
    {
    print $out $_;
    }

close $out;

通常只有一个问题就可以正常工作。在最旧的行和第一个新添加的行之间添加一个空行。例如,如果我上次保存的日期是

15/05/2013  23.04   23.25   22.91   23.24   40153000    23.24

然后添加新行:

16/05/2013  23.1    23.35   23.1    23.27   33023300    23.27

看起来像这样:

15/05/2013  23.04   23.25   22.91   23.24   40153000    23.24

16/05/2013  23.1    23.35   23.1    23.27   33023300    23.27

我希望它看起来像那样:

15/05/2013  23.04   23.25   22.91   23.24   40153000    23.24
16/05/2013  23.1    23.35   23.1    23.27   33023300    23.27

我想在添加行时摆脱\n但是它只产生一个长字符串。我想我应该以某种方式移除\n,但仅限于最后一行。我该怎么做?

编辑:行结尾似乎只是LF,而不是CRLF。那有关系吗?因为目前似乎该行与空行模式不匹配,如下所示:/^\s*$/或此:/^$/

1 个答案:

答案 0 :(得分:1)

您可以使用chomp智能地使用换行符(如果是未翻译的CRLF),则实际输出换行符。在两者之间,如果该行为空,则可以跳过:

while( <$in> )
{
    chomp; chomp;        # Eat up to two newlines, just in case
    next if /^\s*$/;     # Line is empty or contains whitespace
    print $out "$_\n";
}