试验两个交互的perl脚本

时间:2014-12-04 13:13:50

标签: perl stdin

我对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以及编程是如何工作的,所以如果你们有任何提示或调整如何使这更好,我会非常高兴!

感谢您的帮助,我真的很感激!

2 个答案:

答案 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

(很遗憾,我无法完全回答你的问题)

相关问题