在打印到终端时,Perl如何在颜色之间切换?

在打印到终端时,Perl如何在颜色之间切换?,perl,colors,terminal,Perl,Colors,Terminal,为什么下面的脚本不起作用 use strict; use warnings; use Term::ANSIColor ':constants'; my @colors = ( BLUE, GREEN ); my $select; my @data = 1 .. 10; print { $colors[$select++ % @colors] } $_, "\n" for @data; 产出: 在第9行使用“strict refs”时,不能将字符串(“”)用作符号ref。 这似乎是你想要的:

为什么下面的脚本不起作用

use strict;
use warnings;

use Term::ANSIColor ':constants';
my @colors = ( BLUE, GREEN );
my $select;

my @data = 1 .. 10;
print { $colors[$select++ % @colors] } $_, "\n" for @data;
产出:

在第9行使用“strict refs”时,不能将字符串(“”)用作符号ref。


这似乎是你想要的:

print @{[ $colors[$select++ % @colors] ]}, $_, "\n" for @data

我将冒险猜测一个解释:
@{[]}
插值函数的值。我以前在herdoc中使用过它们。

您使用的是
print{$fh}@strings
语法()。大括号中的东西(在简单情况下实际上是可选的)被解释为文件句柄。这里,传递的是字符串而不是文件句柄对象,因此Perl将查找一个名为字符串的全局变量。不幸的是,这个字符串包含时髦的命令序列(碰巧无法打印),而不是一些可用的变量名

解决方案:不要使用那种奇怪的语法,只要这样做就行了

my $select = 0;
print $colors[$select++ % @colors], $_, "\n" for 1 .. 10;

我承认失败,这看起来简单多了!哇,真奇怪。我没想到会在这里提供一份清单。之所以选择filehandle语法,是因为显示的示例有
print BOLD BLUE“Text\n”。事实上,它确实提到了
print BOLD BLUE“Text\n”
print BOLD,BLUE,“Text\n”
略有不同。我当然可以使用这个答案,但我仍然觉得这里有些东西无法解释。@Zaid
print BOLD BLUE$text
不明确,可以解析为
print{BOLD}BLUE($text)
print+BOLD(BLUE($text))
。但是如果在解析时定义了函数
BOLD
(对于导入的sub就是这种情况),它将选择第二种解释,这样一切都很好。我宁愿用逗号来避免这种疯狂。