Вызов скрипта и передача значения из вызываемого скрипта - PullRequest
0 голосов
/ 25 августа 2010

У меня есть один скрипт, который я пытаюсь вызвать из другого скрипта, передавая информацию из скрипта, который вызывается, в вызывающий скрипт. Когда я использую do или require, он проходит, но не передает значение.

ех.

У меня есть следующая строка в нижней части скрипта, который я вызываю

называется script.pl

печать "$ hold IS VALUE \ n";

, который печатает мне значение удержания.

Затем я запускаю вызывающий скрипт с:

calling_script.pl

require 'acc_option.pl'; выведите «HOLD PASSED IS $ hold \ n»;

но переменная hold не печатает.

Какой лучший способ вызвать этот скрипт вместо того, чтобы помещать все на одну длинную задницу?

Ответы [ 2 ]

3 голосов
/ 25 августа 2010

Зависит от того, как было объявлено $ hold.

Если он был объявлен лексически (с помощью «my $ hold ...»), то вы не можете получить к нему непосредственный доступ - он доступен только в рамках файла named_script.pl.

Если он динамически ограничен (локальный $ hold или наш $ hold), то вы сможете получить его, добавив к нему префикс пакета, в котором он был объявлен (поэтому, если он находится в "package Foo;", вы можете получить по адресу это как $ Foo :: hold ").

Тем не менее ...

Как правило, вы не хотите возиться с передачей переменных между скриптами. Сохранение состояния в глобальных переменных может привести к некоторым неприятным сеансам отладки.

В качестве первого шага вы можете инкапсулировать доступ к $ hold внутри подпрограммы, так что в named_script.pl у вас есть что-то вроде:

sub is_on_hold { return $hold };

, который будет возвращать $ hold при вызове (здесь я предполагаю, что $ hold - это своего рода индикатор логического состояния. Если он не называет вашу подпрограмму соответствующим образом, раскрывающим намерение: -)

Если вы опишете, как вы пытаетесь использовать $ hold, более подробно, люди могут дать вам более конкретный совет относительно лучшего способа выполнения вашей задачи.

3 голосов
/ 25 августа 2010

Вы пошли по правильному пути, но все еще далеко.Вы должны использовать модули и статистику use, а не код и инструкцию require.Вы должны попробовать прочитать perldoc perlmod и perldoc perlmodlib, но общая суть такова:

  1. разделить ваш процесс на функции
  2. сгруппируйте эти функции по их действиям
  3. поместите группы функций в модули
  4. напишите скрипт, который использует модули и вызывает функции

Подумайте о скриптекак скелет, а функции - как скелет.

Вот простой модуль и скрипт, который его использует:

ExampleModule.pm:

package ExampleModule;

use strict;
use warnings;

use base 'Exporter';

our @EXPORT_OK  = qw/do_first_thing do_second_thing do_third_thing/;

sub do_first_thing {
    my ($thing) = @_;

    return $thing + 1;
}

sub do_second_thing {
    my ($thing) = @_;

    return $thing + 1;
}

sub do_third_thing {
    my ($thing) = @_;

    return $thing + 1;
}

1;

пример.pl:

#!/usr/bin/perl

use strict;
use warnings;

use ExampleModule qw/do_first_thing do_second_thing do_third_thing/;

my $thing = 0;

$thing = do_first_thing($thing);
$thing = do_second_thing($thing);
$thing = do_third_thing($thing);

print "$thing\n";
...