Tạo một đường ống giống như vỏ của bạn.
Dưới đây là chuỗi đáng sợ của chúng tôi:
my $str = "foo * ~ bar \0 baz *";
Chúng tôi sẽ xây dựng đường ống dẫn của chúng tôi về phía sau, vì vậy đầu tiên chúng tôi thu thập kết quả từ chương trình 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";
}
}
Lưu ý đặc biệt "-|"
lập luận để Perl của open
nhà điều hành.
Nếu bạn mở một đường ống trên lệnh '-'
, tức, hoặc '|-'
hoặc '-|'
với 2 đối số (hoặc 1 đối số) dưới dạng open()
, sau đó là một tiềm ẩn fork
thực hiện, và giá trị trả về của open
là pid của đứa trẻ trong quá trình cha mẹ, và 0
trong quá trình con ... Filehandle cư xử bình thường cho cha mẹ, nhưng i/o để tập tin đó là đường ống từ/đến STDOUT
/STDIN
của quá trình con.
Có unpack
để xem nội dung dữ liệu được đọc từ đường ống.
Trong chương trình của bạn, bạn sẽ muốn chạy các chương trình Java, nhưng mã dưới đây sử dụng một fax hợp lý:
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";
}
Cuối cùng, cháu khiêm tốn chỉ đơn giản in chuỗi đáng sợ (mà đến trên tiêu chuẩn đầu vào của chương trình Java) và thoát. Đặt $|
thành giá trị thực sẽ xóa tập tin được chọn hiện tại và đặt nó ở chế độ không bị chặn.
else {
print $str;
$| = 1;
exit 0;
}
}
đầu ra của nó:
$ ./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
Lưu ý rằng NUL sống sót sau chuyến đi.
Điều đó có vẻ tuyệt vời nhưng làm cách nào để có được kết quả đầu ra của lệnh? – spudly
@spudly, bạn không thể có đề xuất đó. Bạn cần phải sử dụng open2(), kiểm tra perldoc perlipc cho "giao tiếp hai chiều" – jsoverson
Nhiều công dụng của open2 hoặc open3 trên các hệ thống Windows bị cản trở bởi thực tế là bạn chỉ có thể 'chọn' đối với một socket trên Win32. Nếu bạn không ở trên Windows hoặc chặn là ok, thì open2 hoặc open3 có thể làm thủ thuật cho bạn. – daotoad