0

我有一个脚本我试图从另一个脚本调用,将信息从被调用的脚本传递给调用脚本。当我使用 do 或 require 时,它​​会运行但不传递值。

前任。

我正在调用的脚本底部有以下行

称为脚本.pl

print "$hold 是值\n";

这打印了我持有的价值。

然后我开始调用脚本:

调用脚本.pl

需要'acc_option.pl';print "HOLD PASSED IS $hold\n";

但变量保持不打印。

调用此脚本而不是将所有内容放在一个长页面上的最佳方法是什么?

4

2 回答 2

3

你已经开始走上正确的道路,但仍有一段路要走。您应该使用模块和use语句,而不是代码和require语句。您应该尝试阅读perldoc perlmodand perldoc perlmodlib,但一般要点是:

  1. 将您的流程分解为功能
  2. 按功能对它们进行分组
  3. 将功能组放入模块中
  4. 编写一个使用模块并调用函数的脚本

将脚本视为骨架,将功能视为充实骨架。

这是一个简单的模块和使用它的脚本:

示例模块.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";
于 2010-08-24T23:30:35.590 回答
3

这取决于如何声明 $hold。

如果它是在词法上声明的(使用“my $hold...”),那么你不能直接得到它——它只能在 called_script.pl 的范围内访问。

如果它是动态范围的(本地 $hold 或我们的 $hold),那么您应该能够通过在它下面声明的包作为前缀来获取它(因此,如果它在“package Foo;”中,您可以将它作为 $ Foo:: 持有”)。

那就是说...

您通常不希望在脚本之间传递变量。在全局变量中存储状态会导致一些讨厌的调试会话。

作为第一步,您可能希望将访问 $hold 封装在子例程中,因此在 called_script.pl 中您有类似的内容:

sub is_on_hold { return $hold };

调用时将返回 $hold (我在这里假设 $hold 是某种布尔状态指示符。如果它没有以适当的意图揭示方式命名您的子例程:-)

如果您更详细地描述您如何尝试使用 $hold,那么人们可能会就更好地完成任务的方式提供一些更具体的建议。

于 2010-08-24T23:35:38.257 回答