【问题标题】:Why is Perl's chomp affecting the output of my print?为什么 Perl 的 chomp 会影响我的打印输出?
【发布时间】:2012-05-24 13:56:28
【问题描述】:

自从我成为 Perling 以来已经有几个月了,但我完全不知道为什么会发生这种情况......

如果重要的话,我在 OSX 上。

我正在尝试转换文件中的行,例如

08/03/2011 01:00 PDT,1.11

进入标准输出行,如

XXX, 20120803, 0100, KWH, 0.2809, A, YYY

由于我正在读取一个文件,我想在读入每一行后chomp。但是,当我chomp 时,我发现我的打印变得一团糟。当我不chomp 时,打印很好(除了额外的换行符......)。这是怎么回事?

while(<SOURCE>) {
    chomp;
    my @tokens = split(' |,');     # @tokens now [08/03/2011, 01:00, PDT, 1.11]

    my $converted_date = convertDate($tokens[0]);
    my $converted_time = convertTime($tokens[1]);

print<<EOF;
$XXX, $converted_date, $converted_time, KWH, $tokens[3], A, YYY
EOF
}

chomp 在那里调用,输出都混淆了:

, A, YYY10803, 0100, KWH, 1.11

如果没有 chomp 调用,它至少会以正确的顺序打印,但会有额外的新行:

XXX, 20110803, 0100, 千瓦时, 1.11
, A, YYY

请注意,chomp 在那里,就像它覆盖了第一行“顶部”的换行符。我已经添加了$|=1; autoflush,但不知道这里还能做什么。

想法?并提前感谢....

【问题讨论】:

标签: perl chomp


【解决方案1】:

您输入的行以 CR LF 结尾。您只删除了 LF。一个简单的解决方案是使用以下内容而不是chomp:

s/\s+\z//;

您还可以使用dos2unix 命令行工具在将文件传递给 Perl 之前对其进行转换。

【讨论】:

  • 呃!非常感谢。就是这样。
【解决方案2】:

问题是你有 DOS 行尾并且运行在 Perl 的 Unix 版本上。

一个解决方案是使用PerlIO::eol。您可能需要安装它,但程序中不需要use 行。

那你就可以写了

binmode ':raw:eol(LF)', $filehandle;

此后,无论文件的格式或来源如何,读取的行都将以标准"\n" 终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2021-08-06
    • 1970-01-01
    • 2022-11-06
    相关资源
    最近更新 更多