【问题标题】:Lines are not getting printed after application of chomp in perl在 perl 中应用 chomp 后没有打印行
【发布时间】:2014-06-04 15:37:30
【问题描述】:
#!/usr/bin/perl
use warnings;
use Switch;

while (<>) {
  next if /^\s*\/\//;
  next if /^\s*$/;
  my $line="$_";
  chomp($line);
  print $line;
  print "Checking for line:\n$line";
}

这是我从命令行获取输入文件的代码。它接受以下文件作为输入:

// Computes R0 = 2 + 3

@2
D=A
@3
D=D+A
@0
M=D

在代码中,我尝试在 chomp 函数的帮助下删除每行末尾的换行符。但是,当我在应用 chomp 后尝试打印该行时,它不会为该行打印任何内容。它给出以下输出:

检查线路: 检查线路: 检查线路: 检查线路: 检查线路: 检查线路:

为什么没有打印行?

【问题讨论】:

  • 您的输入是否有\r\n 行尾?
  • 我不认为它有这种类型的结尾,但它仍然不应该至少在换行符之前打印剩余的字符
  • 您能否确保 print $line 在您的两条 next 行之后返回一些内容
  • (不相关 - 尽量避免使用Switch。与其说是好处,不如说是问题。)

标签: perl scripting chomp


【解决方案1】:

如果输入有\r\n 行结尾,我可以重现您的问题。 chomp 将删除 \n 但留下 \r,这(在 Unix 上)将具有将光标移动到行首的效果(不前进到下一行)。由于您的行很短,下一个输出 (Checking for line) 会完全覆盖它。


对不起,鲍罗丁。所以解决方案是:

  1. 不要在 Windows 上为您的 Unix Perl 脚本创建输入文件,或者如果您必须这样做
  2. 使用比chomp 更强大的东西。我一直喜欢用

    $line =~ s/\s+$//;
    

    只要你不需要保留尾随空格

【讨论】:

  • ...解决方案是?!
  • 我如何知道这些行是否有 \r\n 结尾。有没有办法检查?
  • 显然只是if $string =~ /\r\n$/
猜你喜欢
  • 2019-08-30
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多