调用脚本并从被调用脚本传递值

时间:2010-08-24 23:06:41

标签: perl system execute

我有一个脚本我试图从另一个脚本调用,将信息从正在调用的脚本传递给调用脚本。当我使用do或要求它运行但没有传递该值。

离。

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

名为script.pl

打印“$ hold IS VALUE \ n”;

打印出hold值。

然后我用:

启动调用脚本

calling_script.pl

要求'acc_option.pl'; 打印“HOLD PASSED IS $ hold \ n”;

但变量hold不打印。

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

2 个答案:

答案 0 :(得分:3)

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

  1. 将您的流程分解为函数
  2. 按照他们的行为对这些功能进行分组
  3. 将功能组放入模块
  4. 编写一个使用模块并调用函数的脚本
  5. 将脚本视为骨架,将功能视为充实骨架。

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

    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;
    

    example.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";
    

答案 1 :(得分:3)

这取决于$ hold的声明方式。

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

如果它是动态范围的(本地$ hold,或者我们的$ hold)那么你应该能够通过在它前面声明它的包前面来获取它(所以如果它在“package Foo;”你可以得到它为$ Foo :: hold“)。

那说......

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

作为第一步,你可能想要在子例程中封装访问$ hold,所以在called_script.pl中你有类似的东西:

sub is_on_hold { return $hold };

它会在调用时返回$ hold(我假设$ hold是某种布尔状态指示符。如果它没有以适当的意图显示你的子程序的方式: - )

如果你描述一下你如何尝试使用$ hold更详细的话,那么民间可能会就更好的方式提供一些更具体的建议。