Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли.... Передача другой программе 
:(
    Опции темы
Семён Розовых
Дата 3.12.2002, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.11.2002

Репутация: нет
Всего: нет



Можно ли при выполниниии какого либо условия предать управление другому файлу.pl Например:

If ($d==$y) {

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

} else {

А вот здесь что б шла передача управления другой программе
}   :)
PM MAIL   Вверх
Powerhead
Дата 3.12.2002, 23:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Самый простой способ:

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

Это работает только в том случае, если программа ранее не выводила никаких заголовков.
Можно вызвать через system(); do, whait, зависит от того, что тебе нужно
  Вверх
NightGoblin
Дата 4.12.2002, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



: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);
}



--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
Powerhead
Дата 13.12.2002, 01:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



Цитата(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"


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


--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0715 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.