2014-12-04 2 views
1

Я новичок в perl и программировании в целом. прямо сейчас я пытаюсь узнать немного больше о том, как я могу сделать два сценария perl, и о родительских/дочерних процессах. для этой цели, я написал две маленькие перл скрипты (a.pl и b.pl), чтобы научить себя немного больше об этих вещах:экспериментирует с двумя взаимодействующими скриптами perl

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» обратно в первый скрипт, заключается в том, что я хотел понять, как работают родительские/дочерние процессы. если я правильно понял perldoc «system», эта функция помещает родительский процесс (в моем случае a.pl) на удержание, пока завершится дочерний процесс (b.pl). теперь объясняет, почему a.pl завершается, когда b.pl умирает при условии «если $ answer eq" y "". но что, если я хочу, чтобы родительский процесс умирал, и дочерний процесс продолжался в определенном состоянии (например, «если $ answer eq« n »)? как это сейчас, программа печатала бы оба утверждения (одно из a.pl и из b.pl), когда второй STDIN отвечает с «n». что было бы разумным способом сделать это?

другое дело, я задавался вопросом о том, что когда я писал сценарии, я поставил строки 5-9 a.pl так:

my $card = <STDIN>; 
system('./b.pl $card'); 

, который не работал, потому что независимо от того, что я вошел в STDIN , системная функция не передавала никаких аргументов, а @ARGV в b.pl всегда возвращалась 0. это потому, что вы не можете использовать переменную в качестве аргумента системы или что-то не так с синтаксисом?

Как я уже говорил, я стараюсь как можно больше узнать о perl и о том, как работает программирование, поэтому, если у вас есть какие-либо советы или хитрости о том, как сделать это лучше, я был бы более чем счастлив!

благодарит за вашу помощь, я очень ценю это!

креветка

+2

Что вы пытаетесь сделать, это взаимодействие между процессами, коротким ipc. Существует целая страница [perldoc] (http://perldoc.perl.org/perlipc.html), посвященная этой теме, но это сопоставимый тяжелый материал для новичка. Я бы начал с ['readline' /' \ '\' '] (http://perldoc.perl.org/functions/readline.html), а затем вы можете посмотреть [' open2'] (https://metacpan.org/pod/IPC::Open2). –

ответ

1

Другое дело,

система ('./ b.pl $ карта');

Это потому, что вы используете одиночную кавычку, если вы использовали двойные кавычки, это должно было сработать. Одиночные кавычки используются как буквальная строка. В двойных кавычках переменные заменяются на их значение.

система ("./ b.pl $ card");

Более подробную информацию по котировкам: http://www.perlmonks.org/?node=quotes+in+Perl

(К сожалению, я не могу полностью ответить на ваш вопрос)

+0

Вы правы, спасибо за указание на это! – Prawn

2

Обычно вы не хотите использовать систему(), чтобы породить второй процесс PERL ...
Существует много случаев, когда разные процессы perl должны «разговаривать» друг с другом ...
Для получения общей информации о IPC (Inter Process Communication) см. here.
(возможно) наиболее распространенным способом обмена информацией между различными процессами perl является «сокеты»: IO::Socket.

+0

спасибо за ответ, я просмотрю его! – Prawn

Смежные вопросы