我对perl和一般的编程都是新手。现在我正在尝试更多地了解如何使两个perl脚本交互,以及关于父/子进程。 为此,我写了两个小的perl脚本(a.pl和b.pl)来教自己更多关于这些事情:
a.pl:
#!/usr/bin/env perl
use strict;
use warnings;
print "\npick a card, any card you want!\n>";
my $card = <STDIN>;
my @cmd = ('./b.pl');
push @cmd, $card;
system(@cmd);
print "sorry, i can't tell you the trick. magician's code...\n";
b.pl:
#!/usr/bin/env perl
use strict;
use warnings;
my $card = "@ARGV";
print "\nis this your card?\n\n$card\n(y/n)>";
chomp(my $answer = <STDIN>);
exit if $answer eq "y";
print "will i ever be a true magician?\n\n" if $answer eq "n";
有一些关于此的事情,我想请一些建议。首先:我将反应传递给&#34; y&#34;回到第一个脚本是我想了解父/子进程如何工作。如果我理解&#34;系统&#34;的perldoc。正确地说,这个函数将父进程(在我的例子中是a.pl)置于保持状态,直到子进程(b.pl)结束。现在这解释了为什么当b.pl在条件下死亡时a.pl正在完成&#34;如果$ answer eq&#34; y&#34; &#34 ;.但是如果我希望父进程死亡并且子进程在某种条件下继续(例如&#34;如果$ answer eq&#34; n&#34;&#34;)该怎么办?就像现在一样,当第二个STDIN与#34; n&#34;回答时,程序将打印两个语句(来自a.pl和来自b.pl的语句)。什么是聪明的方法呢?
我想知道的另一件事是,当我编写脚本时,我将a.pl的第5-9行放在这样:
my $card = <STDIN>;
system('./b.pl $card');
哪个不起作用,因为无论我输入STDIN,系统函数都没有传递任何参数,而b.pl中的@ARGV总是返回0.这是因为你不能使用变量作为系统的参数,或者语法有问题吗?
正如我之前所说,我正在尽可能多地了解perl以及编程是如何工作的,所以如果你们有任何提示或调整如何使这更好,我会非常高兴!
感谢您的帮助,我真的很感激!
虾
答案 0 :(得分:2)
通常你不想使用system()来产生第二个perl进程...
在许多情况下,不同的perl进程需要&#34; talk&#34;彼此...
有关IPC(进程间通信)的一般信息,请参阅here
(可能)在不同的perl进程之间交换信息的最常见方式是&#34; socket&#34;:IO::Socket。
答案 1 :(得分:1)
另一件事,
system('。/ b.pl $ card');
那是因为你使用单引号,如果你使用双引号它应该有效。单引号用作文字字符串。在双引号中,变量将替换为它们的值。
system(“./ b.pl $ card”);
有关报价的更多信息: http://www.perlmonks.org/?node=quotes+in+Perl
(很遗憾,我无法完全回答你的问题)