Nano Hash - криптовалюты, майнинг, программирование

обнаружение встроенной ошибки Java в Perl

В этом небольшом perl-скрипте с использованием встроенного синтаксического анализатора saxon XSLT:

use Inline::Java;
use warnings;
use XML::Saxon::XSLT2;
open(my $xslt, '<:encoding(UTF-8)', $xslfile) or die $!;
open(my $xml, '<:encoding(UTF-8)', $xmlfile) or die $!;
my $trans  = XML::Saxon::XSLT2->new($xslt);
my $output = $trans->transform($xml);
print $output;

Хотелось бы поймать ошибки трансформации от saxon. При запуске скрипта из командной строки ошибки записываются в STDERR. Но как я могу перенаправить сообщение об ошибке в файл внутри сценария perl? Я попробовал Tie :: STDERR, который не работает.

Я пытался перенаправить STDERR с помощью

 open my $log_fh, '>>', '/tmp/the-log-file';
 *STDERR = $log_fh;

Затем в / tmp / the-log-file регистрируются ошибки perl, но не ошибки saxon.


Ответы:


1

Вы должны иметь возможность сделать это с помощью Capture :: Tiny, который может захватывать STDOUT и STDERR из внешних программ и XS.

use strict;
use warnings;
use XML::Saxon::XSLT2;
use Capture::Tiny 'capture';

my ($xslfile, $xmlfile) = ( ... ); 

open(my $xslt, '<:encoding(UTF-8)', $xslfile) or die $!;
open(my $xml, '<:encoding(UTF-8)', $xmlfile) or die $!;

my $trans  = XML::Saxon::XSLT2->new($xslt);
my $output;
my ( $stdout, $stderr ) = capture {
  $output = $trans->transform($xml);
};

print $output;

Обратите внимание, я не проверял это. Также я не вижу, где вам нужен Inline :: Java.

13.08.2015

2

JVM имеет собственное понятие стандартной ошибки, которым нелегко манипулировать из Perl. Чтобы делать то, что вы хотите, я думаю, вам нужно сбросить STDERR перед запуском JVM. Для этого потребуется блок BEGIN, который появится перед вашим оператором use Inline Java.

Подтверждение концепции:

# javaerr.pl
BEGIN {
    open OLDERR, '>&STDERR'; # save orig STDERR
    open STDERR, '>', 'foo'; # redirect before JVM starts
}

use Inline Java => <<'END_OF_JAVA_CODE';
public class Foo {
  static { 
    System.err.println("loaded Foo static block");
  }

  public Foo() {
  }

  public void warn(String msg) {
    System.err.println("Foo warning: " + msg);
  }
}
END_OF_JAVA_CODE

*STDERR = *OLDERR;        # restore orig STDERR
open STDERR, '>', 'bar';  # or direct it somewhere else

$Foo = Foo->new();
$Foo->warn("hello world");

print STDERR "goodbye\n";

--

$ perl javaerr.pl
$ cat foo
loaded Foo static block
Foo warning: hello world
$ cat bar
goodbye
13.08.2015
  • сброс STDERR перед запуском JVM работает, спасибо! 14.08.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..