Есть ли разница между File::Tee и открытием трубы в тройник?

У меня есть вопрос об этом ответе, цитируемом ниже, от friedo на другой вопрос здесь. (У меня нет разрешения комментировать это, поэтому я задаю это как вопрос.)

«Вы можете использовать File::Tee.

use File::Tee qw(tee);
tee STDOUT, '>>', 'some_file.out';
print "w00p w00p";

Если File::Tee недоступен, его легко смоделировать с помощью конвейера:

open my $tee, "|-", "tee some_file.out";
print $tee "w00p w00p";
close $tee;

Обе эти футболки одинаковые? Или один из Perl, а другой из Linux/Unix?


person AnuragChauhan    schedule 24.07.2013    source источник


Ответы (1)


Они почти одинаковы, но детали реализации различаются.

Открытие канала для tee some_file.out разветвляет новый процесс и запускает служебную программу Unix/Linux tee(1) в нем. Эта программа читает свой стандартный ввод (то есть все, что вы пишете в канал) и записывает его как в some_file.out, так и в стандартный вывод (который она наследует от вашей программы).

Очевидно, что это не будет работать под Windows или любой другой системой, которая не поддерживает команду tee в стиле Unix.


С другой стороны, модуль File::Tee реализован на чистом Perl и не зависит ни от каких внешних программ. Однако, согласно его документации, он также работает, разветвляя новый процесс и запуская под ним то, что по сути является повторной реализацией команды Unix tee на Perl. Это имеет некоторые преимущества, как указано в документации:

Он реализуется на основе форка, создавая новый процесс для каждого ти-потока. Таким образом, нет проблем с обработкой вывода, созданного внешними программами, работающими с системой или модулями XS. которые не проходят через perlio.

С другой стороны, использование fork имеет и свои недостатки:

ОШИБКИ

Не работает на Windows (патчи приветствуются).


Если вам нужна реализация tee на чистом Perl, которая работает на всех платформах, рассмотрите возможность использования IO. ::Tee вместо этого. В отличие от File::Tee, этот модуль реализован с использованием PerlIO и не использует fork. Увы, это также означает, что он может неправильно фиксировать выходные данные внешних программ, выполняемых с модулями system или XS, которые обходят PerlIO.

person Ilmari Karonen    schedule 24.07.2013
comment
+1 и удаляю свой ответ - я перепутал его с IO::Tee, File::Tee основан на форке.. - person jm666; 24.07.2013