在Windows命令提示符下为Perl输出着色

RG婴儿潮

该问题与以下问题有关:如何在Windows上从Perl脚本为输出文本着色?

但是更具体一些。在某种程度上,我已经可以进行跨平台的着色了:

use Term::ANSIColor;
use Win32::Console;

if (!(-f STDOUT)) {
    if ($^O =~ /win/) {
        our $FG_BLUE;
        our $FG_YELLOW;
        our $FG_RED;
        our $BG_GREEN;
        my $CONSOLE = Win32::Console->new(STD_OUTPUT_HANDLE);
        my $attr = $CONSOLE->Attr(); # Get current console colors
        $blue   = sub {$CONSOLE->Attr($FG_BLUE);return};
        $reset  = sub {$CONSOLE->Attr($attr);return};
        $yellow = sub {$CONSOLE->Attr($FG_YELLOW);return};
        $red    = sub {$CONSOLE->Attr($FG_RED);return};
    } else {
        $blue   = sub {return color('bold blue')};
        $reset  = sub {return color('reset')};
        $yellow = sub {return color('yellow')};
        $red    = sub {return color('red')};
    }
}

但是从字符串内部调用函数时,终端颜色不会立即更改,因此:

    print "${\$blue->()} this is blue\n";
    print "${\$blue->()}This is... not blue${\$reset->()}\n";
    print "this is Blue ${\$blue->()}\n";
    print "this is reset${\$reset->()}\n";

我想知道是否可以做这样的事情:

    my $print_help = <<PRINT_HELP;
    Usage:  $toolname [-Options] [-fields name1,[name2],...]
    ${\$red->()} toolname version VERSION ${\$reset->()} 
    ${\$blue->()} options: ${\$reset->()}

    PRINT_HELP

    print $print_help;

打印没有颜色。我尝试设置$ | = 1,没有运气。

我没有选择在有问题的系统上安装Win32 :: Console :: ANSI,因此我无法使使用该模块的任何解决方案正常工作。

池上

你在呼唤redresetbluereset你甚至开始打印前。您可以使用模板。这是一个可靠的实现:

use FindBin qw( $RealBin );
use lib "$RealBin/lib";

use My::Console qw( );

my $console = My::Console->new;

my $print_help = <<'__END_OF_HELP__';
Usage:  $toolname [-Options] [-fields name1,[name2],...]
{{red}}toolname version VERSION{{reset}}
{{blue}}options:{{reset}}

__END_OF_HELP__

$console->print_with_color($print_help);

lib/My/Console.pm

package My::Console;

use strict;
use warnings;

my $console;
BEGIN {
   if (!-t STDOUT) {
      require My::Console::Dumb;
      $console = My::Console::Dumb::;
   }
   elsif ($^O eq 'Win32') {
      require My::Console::Win32;
      $console = My::Console::Win32::;
   }
   else {
      require My::Console::ANSI;
      $console = My::Console::ANSI::;
   }
}

sub new { $console }

1;

lib/My/Console/Base.pm

package My::Console::Base;

use strict;
use warnings;

use Carp qw( croak );

my %allowed_cmds = map { $_ => 1 } qw( red blue reset );

sub red   { }
sub blue  { }
sub reset { }

sub print { print(STDOUT @_); }

sub print_with_color {
   my $self = shift;

   for (@_) {
      /\G ( (?: [^{] | \{(?!\{) )+ ) /xgc
         and $self->print($1);

      /\G \z /xgc
         and next;

      /\G \{\{ /xgc;

      /\G ( (?: [^}] | \}(?!\}) )* ) \}\} /xgc
         or croak("Bad template");

      my $cmd = $1;
      if ($cmd eq "") {
         # An escape mechanism. Use "{{}}" to output "{{".
         $self->print("{{");
         redo;
      }

      $allowed_cmds{$cmd}
         or croak("Unrecognized command \"$cmd\"");

      $self->$cmd();
      redo;
   }
}

1;

lib/My/Console/Win32.pm

package My::Console::Win32;

use strict;
use warnings;

use My::Console::Base qw( );
use Win32::Console;

our @ISA = My::Console::Base::;

my $CONSOLE = Win32::Console->new(STD_OUTPUT_HANDLE);
my $initial_console_attr = $CONSOLE->Attr();

sub red   { STDOUT->flush; $CONSOLE->Attr($FG_RED); }
sub blue  { STDOUT->flush; $CONSOLE->Attr($FG_BLUE); }
sub reset { STDOUT->flush; $CONSOLE->Attr($initial_console_attr); }

1;

lib/My/Console/ANSI.pm

package My::Console::ANSI;

use strict;
use warnings;

use My::Console::Base qw( );
use Term::ANSIColor   qw( );

our @ISA = My::Console::Base::;

sub red   { print(Term::ANSIColor::red()); }
sub blue  { print(Term::ANSIColor::blue()); }
sub reset { print(Term::ANSIColor::reset()); }

1;

lib/My/Console/Dumb.pm

package My::Console::Dumb;

use strict;
use warnings;

use My::Console::Base qw( );

our @ISA = My::Console::Base::;

1;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Windows命令提示符

来自分类Dev

Windows命令提示符sudo?

来自分类Dev

将环境变量设置为Windows命令提示符下的命令输出

来自分类Dev

如何使Windows命令提示符从命令输出返回子字符串

来自分类Dev

Windows 命令提示符 (cmd.exe) 中失败命令的管道输出

来自分类Dev

在命令提示符下修剪输出

来自分类Dev

在命令提示符和txt中双重输出

来自分类Dev

更改命令提示符下输出的文本颜色?

来自分类Dev

命令提示符读取系统输出

来自分类Dev

命令提示符的输出返回null

来自分类Dev

通过命令提示符执行Perl子例程?

来自分类Dev

带参数的perl命令提示符

来自分类Dev

请在Windows命令提示符下解释以下输出

来自分类Dev

Windows命令提示符创建但不将输出重定向到文件

来自分类Dev

Windows命令提示符创建但不将输出重定向到文件

来自分类Dev

Windows命令提示符中CTRL + N的输出是什么意思?

来自分类Dev

在Windows命令提示符下使用Cygwin程序(sshpass)时不产生任何输出

来自分类Dev

我可以在Windows中显示命令提示符输出的特定部分吗?

来自分类Dev

Windows命令提示符(cmd)移动命令

来自分类Dev

Windows命令提示符(cmd)移动命令

来自分类Dev

CP命令提示符Windows 7无法识别

来自分类Dev

从Windows命令提示符中删除代理设置

来自分类Dev

在Windows上使用C清除命令提示符

来自分类Dev

通过命令提示符静默更新Firefox(Windows)

来自分类Dev

如何获得Windows命令提示符显示时间?

来自分类Dev

Windows命令提示符随机冻结

来自分类Dev

Windows命令提示符或DOS的BSD fortune

来自分类Dev

如何使用Windows命令提示符复制文件

来自分类Dev

在Windows中重新启动命令提示符

Related 相关文章

热门标签

归档