linux - perl 中的 '\b' 字符是如何工作的?

标签 linux perl escaping

根据我的研究,在 perl print 语句中使用的 '\b' 字符应该像“退格键”一样工作,即将光标向后移动一个字符,并删除当前字符。出于这个原因,我曾计划使用此操作在一行中打印操作状态,并随着它的进展进行更新。然而,我注意到虽然光标确实向后移动,但脚下的字符并没有被删除,因此,在较短的打印语句之后,较长的消息仍然存在。我编译了以下示例代码来解释我的发现:

#!/usr/bin/perl

use strict;
use warnings;
my $m;

#set to nonzero so that the screen will update before \n
local $| = 1;

print "Current number shown: ";

$m = "LONG MESSAGE TEMP";
print $m;
print "\b" x length($m);

foreach(1..22) {
        $m = $_;
        print $m;
        print "\b" x length($m);
        #sleep 1; #Uncomment to see updates
}

print "\n";

这是输出:

当前显示的数字:22NG MESSAGE TEMP

如果这确实是 '\b' 的正确操作,是否有另一种删除字符以及将光标移回的转义符?我想避免使用从当前行开头开始的 '\r'。否则,我怎么会错误地使用转义符?

最佳答案

"\b" 只是一种奇特的写法 chr(0x08)。您的终端可能会移动光标而不是显示任何内容,但这完全取决于它。

如果你能靠,那么用空格覆盖就可以达到你想要的效果。

my $last_length = 0;
sub update {
   my ($s) = @_;
   print("\b" x $last_length);
   print(" " x $last_length);
   print("\b" x $last_length);
   print($s);
   $last_length = length($s);
}

或者减少闪烁:

my $last_length = 0;
sub update {
   my ($s) = @_;
   my $diff = $last_length - length($s);
   print("\b" x $last_length);
   print($s);
   print(" " x $diff);
   print("\b" x $diff);
   $last_length = length($s);
}

关于linux - perl 中的 '\b' 字符是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20639488/

相关文章:

linux - %H :%i. pid 在 .service 文件中做什么?

perl - 为什么简单的 XOR 在 Perl 中不起作用?

找不到 perlbrew 命令

java - 从终端输入中转义反斜杠

linux - 当我运行 make menuconfig 或 make config 时它是如何工作的?

linux - resolv.conf 在重新启动时被重写

'file' 命令的 Perl 模块?

sqlite - 无法使用QtSqlDriver从带有“。”的表中检索数据在列名中

linq - 自动生成的 sql 代码 : single backslash as an escape character is failing

Linux,搜索图像文件