Perl 不会在没有换行符的情况下打印多个变量

Posted

技术标签:

【中文标题】Perl 不会在没有换行符的情况下打印多个变量【英文标题】:Perl will not print multiple variables without a newline 【发布时间】:2017-05-09 14:19:38 【问题描述】:

我正在编写一个 perl 脚本来解析“c”头文件并提取枚举类型及其各自的成员。

Ubuntu 12.04 Perl 5.14.2

perl 脚本似乎可以工作,但在某些情况下某些变量不会打印。我已将代码精简为以下最小重复。

我很确定这与缓冲有关...因为如果我在打印第一个变量和其他变量之间添加换行符,它会起作用。

我确实通读了suffering from buffering 和Perl not printing properly,但没有找到解决我自己问题的方法。

这是头文件:

 #ifndef _ENUM_H_
 #define _ENUM_H_ 1

 /**
  * Enum definition
  */
 typedef enum
 
    eENUMVAL0 = 0,
    eENUMVAL1,
    eENUMVAL2,
    eENUMVAL_LAST,
  eMySuperEnum;

 #endif /* _ENUM_H_ */

这是脚本:

 #! /usr/bin/perl
 use strict;
 use warnings;


 our  @apiFile = ();


 if (exists $ARGV[0])
 
     chomp( @apiFile = `cat $ARGV[0]`);
 

 for my $i (0 .. $#apiFile)
 
     if ($apiFile[$i] =~ /^\s*typedef\s+enum/)
     
         print "$apiFile[$i] starts at $i\n"; 
     
 

打印出来:

starts at 6

但是如果我在 $apiFile[$i] 之后的打印中添加一个换行符,那么它会打印整个内容:

print "$apiFile[$i]\nstarts at $i\n";

将打印:

typedef enum
starts at 6

我多次在同一行打印多个变量。引擎盖下发生了什么,以至于 perl 没有在一行上打印这两个变量?

【问题讨论】:

输入文件是否来自windows?它可能包括一个杂散的\r,会搞砸打印。 $apiFile[$i] 包含一个 CR(carrage return),所以光标会设置在行首 【参考方案1】:

最好的猜测是 - 源文件来自 Windows,并且包含虚假的回车。

chomp 在 Linux 上不会处理这个问题。

但是你可以用s来代替:

s/[\r\n]+$//g; 将代替 chomp;

【讨论】:

或者,如果您不想修复 perl 脚本,请在输入文件上运行 dos2unix 或者,s/\R+//g. 这行得通。我刚刚开始认为有一个看不见的角色影响了印刷。它是Linux中的一个文件,所以我没想到会这样。但是,我正在解析的 API 标头是由第三方在 Windows 机器上编写的……所以我通过“set ff?”在 vim 中检查了它。果然“ff = dos”,所以你去。 :)

以上是关于Perl 不会在没有换行符的情况下打印多个变量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Perl 将输入通过管道传输到 Java 应用程序?

Perl正则表达式匹配多行文件与匹配变量如何处理换行

PowerShell 管道添加换行符

shell编程,我多次要cat的结果,我把结果存入变量var,但打印后$var怎么没有了换行符号

打印 CSV 的前 N ​​行,其中引用的字段可以包含换行符

换行符不会连接