【问题标题】:Print pipe per character instead of newline每个字符打印管道而不是换行符
【发布时间】:2014-02-06 08:42:49
【问题描述】:

在 Perl 中我现在喜欢这样:

while (<$pipe>)
{
    print $_;
}

但这只是给我逐行输出。我怎样才能打印出每个字符,或者按\r 而不是\n 分割。管道仅在换行符上为我提供数据。

(我想打印另一个进程的输出,而那个进程正在使用\r 来打印它的进程进度,这对我来说只是一条简单的线,100% ..)

【问题讨论】:

标签: perl split newline pipe


【解决方案1】:

Perl 有一个“输入记录分隔符”$/ 的概念,它通常设置为分隔行。您可以阅读full documentation here。每当您从文件句柄中读取一行/记录时,都会读取数据直到文件末尾,或者直到读取 $/ 变量中的当前字符串。

例如:给定输入字节aabaa$/ = "b",那么my @records = &lt;$fh&gt; 将产生('aab', 'aa')。请注意,始终包含分隔符,但可以使用 chomp 删除(无论分隔符设置为什么)。

从文件读取时,必须在读取行之前设置$/,如下所示:

local $/ = "\r"; # "local" avoids overriding this value everywhere
while(my $line = <$pipe>) {
  chomp $line;
  ...
}

$/ 有几个特殊值:

  • 空字符串$/ = '' 将两个或多个连续\ns 的序列视为分隔符(“段落模式”)。
  • 如果设置为数字引用,则读取该字符数:$/ = \42(以 42 个字符块读取)。在这种情况下,人们宁愿使用read 函数。

【讨论】:

  • 有什么方法可以使用“\r|\n”吗?因为进度完成后,每一行都用“\n”分隔。
  • @DavidEverlöf 不,只能使用常量字符串(加上特殊大小写的段落模式)。允许在$/ 中使用正则表达式经常出现在 Perl5-Porters 列表中,但是有很多反对意见的好处,因此没有人最终实现任何东西:-(但是,如果你愿意,你可以重新分配记录分隔符,例如$/ = "\n" if $progress_is_done.
  • 好的,谢谢!是的,这就是我下一步的想法。但是这可能会变得相当笨拙,因为执行了任意命令,并具有不同的进度输出。无论如何,感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2018-12-19
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
相关资源
最近更新 更多