Bts*_*Bts 1 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";
Run Code Online (Sandbox Code Playgroud)
这是输出:
Current number shown: 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);
}
Run Code Online (Sandbox Code Playgroud)
或者减少闪烁:
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2195 次 |
| 最近记录: |