我对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";关于这件事,我想征求几点意见。首先:我将"y“的反应传递回第一个脚本的原因是,我想了解父进程/子进程是如何工作的。如果我正确地理解了"system“的perldoc,这个函数将父进程(在我的例子中是a.pl)搁置到子进程(b.pl)完成为止。现在,这解释了为什么当a.pl在"if $answer eq“"y”条件下死亡时,$answer会被完成。但是,如果我希望父进程死掉,子进程在特定条件下继续(例如,"if $answer eq "n“"),该怎么办?现在,当第二个STDIN用"n“表示时,程序将同时打印这两个语句(来自a.pl和b.pl的语句)。怎样才是明智之举?
另一件我想知道的是,当我编写脚本时,我把a.pl的第5-9行写成这样:
my $card = <STDIN>;
system('./b.pl $card');这不起作用,因为无论我输入了什么STDIN,系统函数都没有传递任何参数,b.pl中的@ARGV总是返回0。这是因为您不能使用变量作为系统的参数,还是语法有问题?
正如我之前说过的,我正在尽我所能地学习perl和编程如何工作,所以如果你们对如何使这件事变得更好有任何建议或调整,我会非常高兴!
谢谢你的帮助,我真的很感激!
对虾
发布于 2014-12-04 13:21:11
另一件事, 系统(‘./b.pl $card');
这是因为你使用的是单引号,如果你使用双引号,它应该是有效的。单引号用作文字字符串。在双引号中,变量被替换为其值。
系统(“./b.pl $card");
关于引号的更多信息:http://www.perlmonks.org/?node=quotes+in+Perl
(不幸的是,我不能完全回答你的问题)
发布于 2014-12-04 13:25:47
通常您不希望使用system()生成第二个perl进程.
在许多情况下,不同的perl进程需要相互“交谈”.
有关IPC (进程间通信)的一般信息,请参阅这里。
在不同的perl进程之间交换信息的最常见的方法是“套接字”:IO::套接字。
https://stackoverflow.com/questions/27294984
复制相似问题