【问题标题】:Running nested, dependent perl scripts运行嵌套的、依赖的 perl 脚本
【发布时间】:2014-02-10 16:59:31
【问题描述】:

我有两个 perl 脚本需要一起运行。

第一个脚本定义了一些常用函数和一个 main 方法。

脚本 1(one.pl) 示例:

#!/usr/bin/perl
sub getInformation
{
  my $serverMode = $_[0];
  my $port = $_[1];
  return "You\nneed\nto\nparse\nme\nright\nnow\n!\n";
}

#main
&parseInformation(&getInformation($ARGV[0], $ARGV[1]));

第二个是定义两个函数后调用第二个脚本的脚本。

脚本 2(two.pl) 示例:

#!/usr/bin/perl
sub parseInformation
{
  my $parsedInformation = $_[0];
  #omitted
  print "$parsedInformation";
}

my $parameterOne = $ARGV[0];
my $parameterTwo = $ARGV[1];
do "./one.pl $parameterOne $parameterTwo";

命令行用法:

> ./two.pl bayside 20

我已尝试执行此操作,但脚本似乎可以运行,但每当我在 perl -d two.pl 模式下运行脚本时,我都无法从调试器中获得有关其他脚本的任何信息。

我做了一些研究并阅读了有关systemcapturerequiredo 的信息。如果使用系统函数运行脚本,如何导出脚本二中定义的函数?

问题:
1. 有没有办法在 perl 中做到这一点?
2. 如果是这样,我究竟需要如何实现?

我完全理解 perl 就是 perl。不是另一种编程语言。不幸的是,在过渡时,往往会带来他们所知道的东西。我很抱歉。

参考:
How to run a per script from within a perl script
Perl documentation for require function

【问题讨论】:

    标签: perl dependencies


    【解决方案1】:

    一般来说,这不是您在 Perl 中编写可重用通用函数的方式。相反,您应该将大部分代码放入 Perl 模块中,并只编写充当模块包装器的短脚本。这些简短的脚本基本上应该只是抓取和验证命令行参数,将这些参数传递给模块以进行实际工作,然后格式化并输出结果。

    我真的希望我可以推荐perldoc perlmod 来学习编写模块,但它似乎主要集中在细节上,而不是关于如何编写和使用 Perl 模块的高级概述。 Gabor Szabo's tutorial 或许是一个更好的起点。

    这是一个简单的示例,创建一个输出 Unix 时间戳的脚本。这是模块:

    # This file is called "lib/MyLib/DateTime.pm"
    use strict;
    use warnings;
    
    package MyLib::DateTime;
    
    use parent "Exporter";
    our @EXPORT_OK = qw( get_timestamp );
    
    sub get_timestamp {
        my $ts = time;
        return $ts;
    }
    
    1;
    

    这是使用它的脚本:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    use lib "/path/to/lib";   # path to the module we want, but
                              # excluding the "MyLib/DateTime.pm" part
    
    use MyLib::DateTime qw( get_timestamp );  # import the function we want
    
    # Here we might deal with input; e.g. @ARGV
    # but as get_timestamp doesn't need any input, we don't
    # have anything to do.
    
    # Here we'll call the function we defined in the module.
    my $result = get_timestamp();
    
    # And here we'll do the output
    print $result, "\n";
    

    现在,运行脚本应该会输出当前的 Unix 时间戳。另一个使用时间戳执行更复杂操作的脚本也可以使用 MyLib::DateTime。

    更重要的是,另一个需要处理时间戳的模块可以使用 MyLib::DateTime。将逻辑放入模块中,并让这些模块相互使用是 CPAN 的精髓所在。我一直在演示一个非常基本的日期和时间库,但日期时间操作的王者是 CPAN 上的 DateTime 模块。这又使用DateTime::TimeZone

    易于重用代码,以及在 CPAN 上提供免费、经过良好测试和(大部分)文档完善的模块的大型存储库,是 Perl 的主要卖点之一。

    【讨论】:

      【解决方案2】:

      没错。

      同时运行 2 个单独的脚本根本不会让任何一个脚本访问其他函数。它们是 2 个完全独立的过程。您需要使用模块。模块的重点是让您不要重复自己,通常称为“干”编程。一个简单的经验法则是:

      1. 如果您要多次使用一段代码,请将其放入当前脚本的子例程中。
      2. 如果您要在多个程序中使用相同的块,请将其放在一个模块中。
      3. 还要记住,常见问题通常在CPAN 上有一个模块

      这应该足以让您继续前进。那么如果你打算做很多 Perl 编程,你应该买 Larry Wall 的《Programming Perl》一书,如果你用其他语言编程,或者“Learning Perl >" 如果您是编程新手,作者 Randal Schwartz。我是老式的,所以我有两本书都在印刷,但你仍然可以把它们当作电子书。另请查看Perl.org,因为您并不孤单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-27
        • 2019-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多