Создайте конвейер, как ваша оболочка.
Вот наша страшная строка:
my $str = "foo * ~ bar \0 baz *";
Мы построим наш конвейер в обратном направлении, поэтому сначала мы соберем выходные данные программы Java:
my $pid1 = open my $fh1, "-|";
die "$0: fork: $!" unless defined $pid1;
if ($pid1) {
# grab output from Java program
while (<$fh1>) {
chomp;
my @c = unpack "C*" => $_;
print "$_\n => @c\n";
}
}
Обратите внимание на специальный аргумент "-|"
для оператора Perl open
.
Если открыть канал по команде '-'
, , т.е. , либо '|-'
, либо '-|'
с 2-аргументной (или 1-аргументной) формой open()
, то существует неявное fork
выполнено, а возвращаемое значение open
- это pid дочернего элемента в родительском процессе, а 0
в дочернем процессе ... Файловый дескриптор ведет себя нормально для родительского процесса, но ввод / вывод для этого файлового дескриптора передается из / в STDOUT
/ STDIN
дочернего процесса.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * unpack
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1030* * * * * * * * * * * * * * * * * * * * * * * * * * * *1030* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
В вашей программе вы захотите запустить программу на Java, но в приведенном ниже коде используется разумное факсимильное сообщение:
else {
my $pid2 = open my $fh2, "-|";
die "$0: fork: $!" unless defined $pid2;
if ($pid2) {
$| = 1;
open STDIN, "<&=" . fileno($fh2)
or die "$0: dup: $!";
# exec "java", "-jar", "java_program.jar";
# simulate Java program
exec "perl", "-pe", q(
BEGIN { $" = "][" }
my @a = split " ", scalar reverse $_;
$_ = "[@a]\n";
);
die "$0: exec failed";
}
Наконец, скромный внук просто печатает страшную строку (которая поступает на стандартный ввод программы Java) и завершается. Установка $|
в истинное значение сбрасывает текущий выбранный дескриптор файла и переводит его в небуферизованный режим.
else {
print $str;
$| = 1;
exit 0;
}
}
Его выход:
$ ./try
[*][zab][][rab][~][*][oof]
=> 91 42 93 91 122 97 98 93 91 0 93 91 114 97 98 93 91 126 93 91 42 93 91 111 111 102 93
Обратите внимание, что NUL выживает в поездке.