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.2perl 脚本似乎可以工作,但在某些情况下某些变量不会打印。我已将代码精简为以下最小重复。
我很确定这与缓冲有关...因为如果我在打印第一个变量和其他变量之间添加换行符,它会起作用。
我确实通读了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 应用程序?
shell编程,我多次要cat的结果,我把结果存入变量var,但打印后$var怎么没有了换行符号