अपने खोल की तरह एक पाइपलाइन बनाएं।
यहाँ हमारे डरावना स्ट्रिंग है:
my $str = "foo * ~ bar \0 baz *";
हम अपने पाइपलाइन पीछे की ओर का निर्माण करेंगे, इसलिए पहले हम जावा प्रोग्राम से उत्पादन इकट्ठा:
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";
}
}
नोट पर्ल के open
करने के लिए विशेष "-|"
तर्क ऑपरेटर।
आप कमांड '-'
पर एक पाइप को खोलते हैं, यानी, या तो '|-'
या 2-तर्क (या 1-तर्क) open()
के फार्म के साथ '-|'
, तब वहाँ एक अंतर्निहित fork
किया, और वापसी मान है open
बच्चे की प्रक्रिया में बच्चे की पिड है, और 0
बच्चे की प्रक्रिया के भीतर है ... फ़ाइलशैली सामान्य रूप से माता-पिता के लिए व्यवहार करती है, लेकिन उस फ़ाइल के लिए i/o को STDOUT
/STDIN
से बाल प्रक्रिया में पाइप किया गया है।
unpack
पाइप से पढ़ने वाले डेटा की सामग्री में देखने के लिए है।
अपने कार्यक्रम में, आप जावा प्रोग्राम को चलाने के लिए चाहता हूँ, लेकिन नीचे दिए गए कोड को एक उचित प्रतिकृति का उपयोग करता है:
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";
}
अंत में, विनम्र पोता बस डरावना स्ट्रिंग (जो मानक पर आता है प्रिंट जावा प्रोग्राम का इनपुट) और बाहर निकलता है। $|
को एक वास्तविक मान पर सेट करना वर्तमान में चयनित फ़ाइल हैंडल को फ़्लश करता है और इसे अनबफर मोड में रखता है।
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 यात्रा बच जाता है।
यह बहुत अच्छा लग रहा है लेकिन मैं आदेश का आउटपुट कैसे प्राप्त करूं? – spudly
@ स्पूली, आप उस सिफारिश के साथ नहीं कर सकते हैं। आपको open2() का उपयोग करना होगा, "बिडरेक्शनल संचार" के लिए perldoc perlipc की जांच करें – jsoverson
विंडोज सिस्टम पर ओपन 2 या ओपन 3 के कई उपयोग इस तथ्य से मोटे तौर पर बाधित हैं कि आप केवल Win32 पर सॉकेट के खिलाफ 'चयन' कर सकते हैं। यदि आप विंडोज़ या ब्लॉकिंग पर नहीं हैं तो ठीक है, तो ओपन 2 या ओपन 3 आपके लिए चाल कर सकता है। – daotoad