Проблемы с выводом цвета в cmd - PullRequest
1 голос
/ 22 декабря 2010

Вот код:

use Cwd;
use Win32::Console::ANSI;# installed module with ppm
use Term::ANSIColor;

$parent =  cwd();

@files = <*>;
print "\n";
foreach (@files)
{
    $child = "$parent/$_";
    if (-f $_){print "$child\n";}; #file test
    if (-d $_)#directory test
    {
        print color("green")."$child/\n".color("reset");
        my($command) = "cd $child/";#submerge one directory down ( recursive here?)
        $command=~s/\//\\/g;
        system( $command );
    };
}

Проблема в том, как выводится цвет. То, что я ожидаю получить, это «какой-то каталог» зеленого цвета на черном фоне. Вместо этого я получаю зеленый цвет фона и черный текст, иногда белый. У меня есть эта проблема на любой другой код, где я использую цвет (). Я заметил, что проблема исчезает после перезапуска. Кроме того, я подозреваю, что эта проблема возвращается, затрагивая DOS и все его окна, когда я запускаю какой-то другой Perl-код. По сути, если что-то пойдет не так, оно будет работать до перезапуска для каждого экземпляра color (). Похоже на глюк. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 22 декабря 2010

Я не наблюдаю проблему. Однако тот факт, что вы используете system (который запускает другую оболочку для выполнения команды и, следовательно, действительно не меняет ваш каталог), может быть тем, что мешает. В противном случае консоль может остаться в неопределенном состоянии, если вы используете CTRL-C для выхода из сценария.

Вот лучший способ выполнить то, что вы хотите:

#!/usr/bin/perl

use Cwd;
use File::Spec::Functions qw( catfile canonpath );
use Win32::Console::ANSI;
use Term::ANSIColor;

local $SIG{INT} = sub { print color('reset') };

my $top = cwd;

print_contents($top);

sub print_contents {
    my ($dir) = @_;

    opendir my $dir_h, $dir
        or die "Cannot open directory: '$dir': $!";

    while ( defined (my $entry = readdir $dir_h) ) {
        next if $entry =~ /^[.][.]?\z/;
        my $path = canonpath catfile $dir => $entry;
        if ( -f $path ) {
            print "$path\n";
        }
        elsif ( -d $path ) {
            print color('green'), $path, color('reset'), "\n";
            print_contents($path);
        }
    }

    closedir $dir_h
        or die "Cannot close directory: '$dir': $!";
}
...