Для Eclipse работало следующее выражение:
Foo
jadajada Bar "
blockquote>Регулярное выражение:
Foo[\S\s]{1,10}.*Bar*
Вы можете перенаправить stderr
на stdout
на уровне оболочки Windows, выполнив что-то вроде:
perl stuff.pl 2>&1
См. Поддержите статью здесь за официальное слово.
Затем вы можете использовать этот ответ о переполнении стека , чтобы выполнить тройник
из оболочки.
perl stuff.pl 2>&1 | tee stuff.txt
Я использую Log :: Log4perl для подобных вещей. Он обрабатывает отправку вывода в несколько мест для вас, включая экран, файлы, базы данных или что-то еще, что вам нравится. Если вы хоть немного усложнились, вы не должны делать это самостоятельно.
Вместо того, чтобы печатать дескрипторы файлов, вы просто даете Log4perl сообщение, а он сам разберется. У меня есть краткое введение в него в Освоение Perl . Он основан на Log4j, и большую часть того, что вы можете делать в Log4j, вы можете делать в Log4perl, что также означает, что, как только вы его узнаете, он становится передаваемым навыком.
use PerlIO::Util;
*STDOUT->push_layer(tee => ">>/dir/dir/file");
*STDERR->push_layer(tee => ">>/dir/dir/file");
Хотя я широко использую Log :: Dispatch , я использовал приведенное выше, чтобы записать то, что фактически отображалось на экране, в файл.
Итак, вы хотите, чтобы STDERR
вел себя как STDOUT
, обращаясь одновременно к экрану и одному и тому же файлу журнала? Можете ли вы просто дублировать STDERR
на
open(STDERR, ">&STDOUT") or warn "failed to dup STDOUT:$!";
(я не
Просто переназначьте дескриптор файла STDERR
...
use IO::Tee;
my $log_filename = "log.txt";
my $log_filehandle;
open( $log_filehandle, '>>', $log_filename )
or die("Can't open $log_filename for append: $!");
my $tee = IO::Tee->new( $log_filehandle, \*STDOUT );
*STDERR = *$tee{IO};
select $tee;
Следует упомянуть, что я тестировал это в Windows, он работает, но я использую StrawberryPerl.