Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Можно ли....


Автор: Семён Розовых 3.12.2002, 14:58
Можно ли при выполниниии какого либо условия предать управление другому файлу.pl Например:

If ($d==$y) {

.............
.............
.............
.............

} else {

А вот здесь что б шла передача управления другой программе
}   :)

Автор: Powerhead 3.12.2002, 23:10
Самый простой способ:

print "Location:абсолютный_путь_к_скрипиту?переменные\n\n";

Это работает только в том случае, если программа ранее не выводила никаких заголовков.
Можно вызвать через system(); do, whait, зависит от того, что тебе нужно

Автор: NightGoblin 4.12.2002, 10:54
:hmmm Вообще-то "самый простой способ" относится скорее к CGI и HTTP, нежели к самому Perl. Перл применяется далеко не только в CGI-скриптах ;-)

Передать управление другой программе можно несколькими способами:

system ($program); # запустить $program как порожденный процесс
exec ($program); # Заменить текущий процесс на $program
$a = `$program`; # получить в $a стандартный вывод (STDOUT) $program

open (PROG_OUT, "$program|"); # Запустить $program и читать ее STDOUT в дескриптор PROG_OUT
open (PROG_IN, "|$program"); # Запустить $program и соединить дескриптор PROG_IN с ее стандартным вводом (STDIN).

То есть, в предпоследнем примере все, что будет выводить программа на STDOUT, будет подаваться на PROG_OUT и из него можно читать, как из файла. Аналогично, последний вариант передает все, что пишется в PROG_IN, будет передаваться на вводной поток STDIN программы.

system () возвращает код завершения программы. Если нужно запустить программу параллельно с текущим процессом, после имени программы добавляется амперсанд: system ("$program &"); однако это чревато дырками и не будет работать, например, в винде. Лучше сделать так:

Код

$pid = fork ();

die ("Cannot fork: $!\n") unless (defined ($pid));

if ($pid) {
# Мы - родительский процесс
} else {
# Мы - дочерний процесс
exec ($program);
}

Автор: Powerhead 13.12.2002, 01:40
А можно, если не сложно, примерчик вызова привести? Вот два скрипта, как из первого получить результат работы второго?

1----------------лежит на одном хосте
#!usr/bin/perl
...
...
< получить вывод второго скрипта в $a и $b (или в @vals)
print "$a $b";
exit;

2---------------на другом хосте
#!usr/bin/perl
$a = 5;
$b = 2;
exit;

Автор: NightGoblin 14.12.2002, 17:01
Цитата(Guest @ 12.12.2002, 17:40)
А можно, если не сложно, примерчик вызова привести? Вот два скрипта, как из первого получить результат работы второго?

1----------------лежит на одном хосте
#!usr/bin/perl
...
...
< получить вывод второго скрипта в $a и $b (или в @vals)
print "$a $b";
exit;

2---------------на другом хосте
#!usr/bin/perl
$a = 5;
$b = 2;
exit;

Нууу.... это уже совсем другая история... Посмотри man-страницу perlipc - про межпроцессное взаимодействие в Perl: это тебе надо делать через сокеты, если на разных хостах все лежит... Вот могу привести простой пример с использованием IO::Socket (объектная реализация сокетного интерфейса):

(Это скрипт на хосте 1 - вызывать через браузер будем его)
Код

#!/usr/bin/perl

use IO::Socket;

$data = IO::Socket::INET->new (
   'Proto' => 'tcp',
   'PeerAddr' => 'www.url.net',
   'PeerPort' => 'http(80)'
   );

unless (defined ($data)) {
   print ("Content-Type: text/plain\n\nfailed to connect: $!");
   exit (0);
}

print ($data "GET /cgi-bin/script HTTP/1.0\n\n");

while ($n = <$data>) {
   chomp ($n);
   last if $n =~ /^a=(.*?)&&b=(.*)$/; # Переменная a не должна содержать последовательности '&&'
}

($a, $b) = ($1, $2);

close ($data);

print ("Content-Type: text/plain\n\nЗначение a: $a\nЗначение b: $b");


(Некоторые проверки опущены...)

(Это скрипт на хосте 2 (www.url.net) - вызывается скриптом 1)
Код

#!/usr/bin/perl

print ("Content-Type: text/plain\n\na=значение переменной а&&b=значение переменной b");


(другой вариант второго скрипта ;-) )
Код

#!/bin/sh

echo "Content-Type: text/plain"
echo
echo "a=значение A&&b=значение B"


В принципе, должа сработать такая фигня :)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)