perl中的' b'字符如何工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了perl中的' b'字符如何工作?相关的知识,希望对你有一定的参考价值。

根据我的研究,perl打印语句中使用的' b'字符应该像“退格”一样,即将光标移回一个字符,并删除当前字符。出于这个原因,我曾计划使用此操作在一行上打印操作状态,并在进行时进行更新。但是,我注意到,当光标确实向后移动时,脚下的字符不会被删除,因此,较短的打印语句后仍会保留较长的消息。我编译了以下示例代码来解释我的发现:

#!/usr/bin/perl

use strict;
use warnings;
my $m;

#set to nonzero so that the screen will update before 

local $| = 1;

print "Current number shown: ";

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

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

print "
";

这是输出:

Current number shown: 22NG MESSAGE TEMP

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

答案

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

如果您可以依赖它,那么您可以通过用空格覆盖来实现您想要的效果。

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

或者闪烁较少:

my $last_length = 0;
sub update {
   my ($s) = @_;
   my $diff = $last_length - length($s);
   print("" x $last_length);
   print($s);
   print(" " x $diff);
   print("" x $diff);
   $last_length = length($s);
}
另一答案

只需输出一些额外的空格字符即可覆盖您需要覆盖的内容。

#!/usr/bin/env perl

use strict;
use warnings;
use Time::HiRes qw(sleep);

sub backspace {
  print "" x $_[0];
  print " "  x $_[0];
  print "" x $_[0];
}

local $| = 1;

my $m = "LONG MESSAGE TEMP";

print "Current number shown: ", $m;
sleep 1;

for (1..22) {
  backspace( length($m) );
  $m = $_;
  print $m;
  sleep 0.2;
}

print "
";
另一答案

根据它的使用方式, b在Perl命令中可以有特殊含义:

b是仅在字符类中的退格字符。在字符类之外, b单独是单词字符/非字符字符边界。

要在文件中每次出现单词“ABC”时替换“def”,请使用Perl命令:perl -pi -e 's/ABC/def/g' file,它将保留诸如“ZABCD”之类的字符串不变。

以上是关于perl中的' b'字符如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

请问怎么给perl里的标量,哈希,数组赋初值?

perl中如何把所有的情况匹配出来并且把值取到?

Python,如何去掉字符串 s = 'values ( e , b )'中,括号里面的空格?

matlab中的元胞数组中的数字是字符型保存,存在nodata。。如何转换成数值型矩阵????

javascript中的replace函数的使用,如何替换有空格的字符串?

如何使用 Perl 从一组字母中生成单词列表?