gpt4 book ai didi

perl - 用长度较短的语句覆盖打印语句

转载 作者:行者123 更新时间:2023-12-04 04:32:23 27 4
gpt4 key购买 nike

我试图在 foreach 循环中覆盖打印语句以创建一些进度条。

我在做什么:

my $arraySize = @listOfIps;
local $| = 1;
my $counter = 0;
my $progressString;

print 'Progress: ';

foreach my $ip (@listOfIps) {

$counter++;
print "\b" x length($progressString) if defined $progressString;
$progressString = "\r$counter / $arraySize - Working on $ip";
print $progressString;

#does stuff here but thats irrelevant to the problem

}

我遇到的问题是,当 foreach 循环到达一个比它打印的前一个 IP 短的 IP 时,例如 10.0.0.1,它仍然显示前一个较长的打印语句留下的额外字符。

问题:
Progress: 3 / 10 - Working on 200.144.223.211

然后用数组中下一个较小的 ip 地址覆盖此打印语句给出:
Progress: 4 / 10 - Working on 10.0.0.1223.211

等等......实际上它应该只打印:
Progress: 4 / 10 - Working on 10.0.0.1

这样它就不会留下上次打印中的任何字符。

我在这里忽略了一些非常明显的东西,因为我看不出有任何理由为什么这不起作用。

最佳答案

使用 printf使用用空格填充 IP 字符串的格式:

printf "\r$counter / $arraySize - Working on %-15s", $ip;

适配号码 15到你最长的 IP 的长度。如果你有一个变量,你可以像这样在格式字符串中使用它(感谢 amon 分享):
printf ".... Working on %-*s", $length, $ip;

尽管这太过分了,因为您可以使用 printf 控制所有可变长度的字符串。 :
printf "\r%-*s / %-*s - Working on %-*s", 5, $counter, 5, $arraySize, 15, $ip;
\b根据 this answer.,escape 显然是一个非破坏性的退格键,不会删除。这意味着它的作用与 \r 几乎相同在你的情况下。

关于perl - 用长度较短的语句覆盖打印语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20374719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com