gpt4 book ai didi

perl - 如何在 Perl 中测试包含 ANSI 颜色代码的字符串是否等效?

转载 作者:行者123 更新时间:2023-11-28 19:58:31 24 4
gpt4 key购买 nike

我正在为使用 ANSI 颜色代码执行操作的 Perl 模块编写测试。我希望能够测试两个带有嵌入式 ANSI 颜色代码的字符串,看看它们在打印时是否会产生相同的输出。这不是一个简单的字符串相等性测试,因为将多个代码以不同的顺序放置仍然可以得到相同的结果。例如,“粗体”和“蓝色”的代码可以与其中任何一个放在一起以产生粗体蓝色。

那么,有什么简单的方法可以用 ANSI 颜色代码测试两个字符串的输出等价性吗?

最佳答案

最简单的方法是将每个字符串转换为它通过模拟设备 产生的输出表示。 IE。生成一个 (character, colour, boldness) 元组列表(添加您要跟踪的任何其他属性),每个元组对应一个要输出的字符。然后,您可以直接比较这些输出是否相等。

这是一个开始的例子:

sub simulate($) {
my ($s) = @_;
my $colour = 'black';
my $bold = 0;
my @output;

while (length $s) {
if ($s =~ s/\A\x1B\[1m//) { $bold = 1; }
elsif ($s =~ s/\A\x1B\[22m//) { $bold = 0; }
elsif ($s =~ s/\A\x1B\[30m//) { $colour = 'black'; }
elsif ($s =~ s/\A\x1B\[31m//) { $colour = 'red'; }
# ...
else { # Plain character to be output
s/\A(.)//s;
push @output, [ $1, $colour, $bold ];
}
}

return @output;
}

# Example usage
use Test::More;
is_deeply(
simulate("Hi \x1B[31\x1B[1mthere!"),
simulate("Hi \x1B[1\x1B[31mthere!"),
"FTW!");

关于perl - 如何在 Perl 中测试包含 ANSI 颜色代码的字符串是否等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755055/

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