我在文本文件中保存了每天股票价格的文件,文件的每一行代表一天的数据。例如:
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
我已经创建了一个更新程序,它检查保存文件中的最后日期(最后日期出现在文件的顶部),将其与当前日期进行比较,如果不相等,则只通过附加缺失的行来更新缺失的数据(新行添加在现有文件的顶部)。
我使用这种方法来附加行:
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 topn";
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
去掉,但只是为了最后一行。我怎么做呢?
EDIT:行尾似乎只是LF
,而不是CRLF
。这有关系吗?因为目前看起来行不匹配像这样的空行模式或这个:/^s*$/
或这个:/^$/
。
您可以使用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";
}